From b0df49a6289d3a57d343bbf5f92390285e6de52b Mon Sep 17 00:00:00 2001 From: llehtahw Date: Sun, 7 Apr 2024 19:44:32 +0800 Subject: [PATCH] Add object (#9) --- Cargo.lock | 109 +++++++++++++++++++++++++++++++++++++++++++--- Cargo.toml | 3 +- procs/src/lib.rs | 8 ++-- src/tuple_proc.rs | 67 ++++++++++++++++++++++------ 4 files changed, 163 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8b80fc8..9c09285 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -74,9 +74,9 @@ checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "cc" -version = "1.0.90" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" +checksum = "1fd97381a8cc6493395a5afc4c691c1084b3768db713b73aa215217aa245d153" [[package]] name = "cfg-if" @@ -84,12 +84,95 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + [[package]] name = "futures-core" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + [[package]] name = "gimli" version = "0.28.1" @@ -192,6 +275,12 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + [[package]] name = "proc-macro2" version = "1.0.79" @@ -249,6 +338,15 @@ dependencies = [ "libc", ] +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + [[package]] name = "smallvec" version = "1.13.2" @@ -267,8 +365,9 @@ dependencies = [ [[package]] name = "statecs" -version = "0.3.1" +version = "0.3.2" dependencies = [ + "futures", "procs", "tokio", "tokio-test", @@ -276,9 +375,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.57" +version = "2.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11a6ae1e52eb25aab8f3fb9fca13be982a373b8f1157ca14b897a825ba4a2d35" +checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index a93d108..28855b9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,13 @@ workspace = { members = ["procs"] } [package] name = "statecs" -version = "0.3.1" +version = "0.3.2" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +futures = "0.3.30" procs = { path = "procs" } [dev-dependencies] diff --git a/procs/src/lib.rs b/procs/src/lib.rs index 5f13689..7404829 100644 --- a/procs/src/lib.rs +++ b/procs/src/lib.rs @@ -224,7 +224,7 @@ fn generic_one_for_macro( input_operands }); stmts.push(Stmt::Expr( - parse_quote!({let _res = _closure(#input_operands); (#after_take_id, _res)}), + parse_quote!({let mut _res = _closure(#input_operands); (#after_take_id, _res)}), None, )); let mut block: syn::ExprBlock = parse_quote!({}); @@ -237,7 +237,7 @@ fn generic_one_for_macro( ($expr:expr => $closure:expr) => { { let #after_take_id = $expr; - let _closure = $closure; + let mut _closure = $closure; let (after_take, res) = #block; after_take.merge(res) } @@ -245,7 +245,7 @@ fn generic_one_for_macro( ($expr:expr => $closure:expr => Option) => { { let #after_take_id = $expr; - let _closure = $closure; + let mut _closure = $closure; let (after_take, res) = #block; if let Some(res) = res { Ok(after_take.merge(res)) @@ -258,7 +258,7 @@ fn generic_one_for_macro( ($expr:expr => $closure:expr => NoMerge) => { { let #after_take_id = $expr; - let _closure = $closure; + let mut _closure = $closure; let (after_take, res) = #block; (res, after_take) } diff --git a/src/tuple_proc.rs b/src/tuple_proc.rs index 0b5f88d..245d40c 100644 --- a/src/tuple_proc.rs +++ b/src/tuple_proc.rs @@ -1,6 +1,7 @@ use crate::apply_tuple; use crate::ComponentGet; use crate::TupleMerge; +use futures::future::FutureExt; use std::{future::Future, marker::PhantomData}; use procs::system_wrap; @@ -70,6 +71,20 @@ macro_rules! cascade_async_fn { }; } +#[macro_export] +macro_rules! cascade_obj_async { + (($obj:expr, $val:expr) => $expr:expr) => { + $expr.into_tuple_processor().cascade_obj_fut($obj, $val) + }; +} + +#[macro_export] +macro_rules! cascade_obj_async_fn { + ($expr:expr) => { + move |obj, x| cascade_obj_async!((obj, x) => $expr) + }; +} + #[macro_export] macro_rules! cascade_option_async { ($val:expr => $expr:expr) => { @@ -183,7 +198,7 @@ macro_rules! impl_tuple_proc { #[allow(non_snake_case)] impl IntoTupleProcessor<($($ids,)*), OType> for F where - F: Fn($($ids,)*) -> OType, + F: FnOnce($($ids,)*) -> OType, { type IType = ($($ids,)*); @@ -197,20 +212,20 @@ macro_rules! impl_tuple_proc { #[allow(non_snake_case)] impl<_F, OType, $($ids,)*> TupleProcessFn<_F, (($($ids,)*), OType)> where - _F: Fn($($ids,)*) -> OType, + _F: FnOnce($($ids,)*) -> OType, OType: TupleExtend, { #[system_wrap( _E: ($($ids,)*) )] - pub fn operate<_E>(&self, e: _E) -> (OType, outof![_E]) { + pub fn operate<_E>(self, e: _E) -> (OType, outof![_E]) { let (r, b) = _E!(e => |($($ids,)*)| self.0($($ids,)*) => NoMerge); (r, b.merge(())) } #[system_wrap( _E: ($($ids,)*) )] - pub fn cascade<_E>(&self, e: _E) -> ::AfterMerge + pub fn cascade<_E>(self, e: _E) -> ::AfterMerge where outof![_E]: TupleMerge, { @@ -221,12 +236,12 @@ macro_rules! impl_tuple_proc { #[allow(non_snake_case)] impl TupleProcessFn)> where - F: Fn($($ids,)*) -> Option, + F: FnOnce($($ids,)*) -> Option, { #[system_wrap( E: ($($ids,)*) )] - pub fn cascade_option(&self, e: E) -> Option<::AfterMerge> + pub fn cascade_option(self, e: E) -> Option<::AfterMerge> where outof![E]: TupleMerge, OType: TupleExtend, @@ -238,13 +253,13 @@ macro_rules! impl_tuple_proc { #[allow(non_snake_case)] impl TupleProcessFn)> where - F: Fn($($ids,)*) -> Result, + F: FnOnce($($ids,)*) -> Result, { #[system_wrap( E: ($($ids,)*) )] pub fn cascade_result( - &self, + self, e: E, ) -> Result<::AfterMerge, ErrType> where @@ -258,7 +273,7 @@ macro_rules! impl_tuple_proc { #[allow(non_snake_case)] impl TupleProcessFn where - F: Fn($($ids,)*) -> Fut, + F: FnOnce($($ids,)*) -> Fut, Fut: Future, OType: TupleExtend, { @@ -283,28 +298,29 @@ macro_rules! impl_tuple_proc { #[allow(non_snake_case)] impl TupleProcessFn where - F: Fn($($ids,)*) -> Fut, + F: FnOnce($($ids,)*) -> Fut, Fut: Future>, { #[system_wrap( E: ($($ids,)*) )] - pub async fn cascade_option_fut( + pub fn cascade_option_fut( self, e: E, - ) -> Option<::AfterMerge> + ) -> impl Future::AfterMerge>> where outof![E]: TupleMerge, OType: TupleExtend, { let (r, b) = E!(e => |($($ids,)*)| self.0($($ids,)*) => NoMerge); - r.await.map(|r| b.merge(()).merge(r)) + // r.await.map(|r| b.merge(()).merge(r)) + r.map(|x| x.map(|r| b.merge(()).merge(r))) } } #[allow(non_snake_case)] impl TupleProcessFn where - F: Fn($($ids,)*) -> Fut, + F: FnOnce($($ids,)*) -> Fut, Fut: Future>, { #[system_wrap( @@ -322,6 +338,29 @@ macro_rules! impl_tuple_proc { r.await.map(|r| b.merge(()).merge(r)) } } + #[allow(non_snake_case)] + impl TupleProcessFn + where + F: FnOnce(Obj, ($($ids,)*)) -> Fut, + Fut: Future)>, + { + #[system_wrap( + E: ($($ids,)*) + )] + pub async fn cascade_obj_fut( + self, + obj: Obj, + e: E, + ) -> (Obj, Option<::AfterMerge>) + where + outof![E]: TupleMerge, + OType: TupleExtend, + { + let (r, b) = E!(e => |($($ids,)*)| self.0(obj, ($($ids,)*)) => NoMerge); + let (obj, r) = r.await; + (obj, r.map(|r| b.merge(()).merge(r))) + } + } }; } apply_tuple!(