From 62507d5c94eae06d6856115c48ce0adcae69cc44 Mon Sep 17 00:00:00 2001 From: llehtahw Date: Fri, 10 May 2024 08:31:50 +0000 Subject: [PATCH] Add TupleRef.. --- Cargo.lock | 56 +++++++++++++++++++-------------------- Cargo.toml | 5 +++- src/entity.rs | 52 ++++++++++++++++++++++++++++++++++++ src/lib.rs | 2 +- src/tuple_proc.rs | 67 ++++++++++++++++++++++++++++------------------- 5 files changed, 125 insertions(+), 57 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1f714c2..fda64aa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -41,9 +41,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "backtrace" @@ -62,9 +62,9 @@ dependencies = [ [[package]] name = "bitflags" -version = "1.3.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "bytes" @@ -74,9 +74,9 @@ checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "cc" -version = "1.0.94" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f6e324229dc011159fcc089755d1e2e216a90d43a7dea6853ca740b84f35e7" +checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" [[package]] name = "cfg-if" @@ -187,15 +187,15 @@ checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "libc" -version = "0.2.153" +version = "0.2.154" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -248,9 +248,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" dependencies = [ "lock_api", "parking_lot_core", @@ -258,15 +258,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.5", ] [[package]] @@ -303,9 +303,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "proc-macro2" -version = "1.0.81" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" +checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" dependencies = [ "unicode-ident", ] @@ -330,18 +330,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" dependencies = [ "bitflags", ] [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "scopeguard" @@ -351,9 +351,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] @@ -375,9 +375,9 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", "windows-sys 0.52.0", @@ -385,7 +385,7 @@ dependencies = [ [[package]] name = "statecs" -version = "0.3.3" +version = "0.4.0" dependencies = [ "futures", "pin-project", @@ -396,9 +396,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.59" +version = "2.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a6531ffc7b071655e4ce2e04bd464c4830bb585a61cabb96cf808f05172615a" +checksum = "c993ed8ccba56ae856363b1845da7266a7cb78e1d146c8a32d54b45a8b831fc9" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index b6a49b5..c2b52e4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ workspace = { members = ["procs"] } [package] name = "statecs" -version = "0.3.3" +version = "0.4.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -14,3 +14,6 @@ procs = { path = "procs" } [dev-dependencies] tokio-test = "0.4.4" tokio = { version = "1", features = ["full"] } + +[lints.clippy] +multiple_bound_locations = "allow" \ No newline at end of file diff --git a/src/entity.rs b/src/entity.rs index d8b7a1e..07c49a1 100644 --- a/src/entity.rs +++ b/src/entity.rs @@ -11,6 +11,43 @@ pub trait TupleExtend { fn extend(self, v: T) -> Self::AfterExtend; } +pub trait TupleRef { + type RefType<'a> + where + Self: 'a; + type MutRefType<'a> + where + Self: 'a; + fn ref_tuple(&self) -> Self::RefType<'_>; + fn mut_tuple(&mut self) -> Self::MutRefType<'_>; +} + +pub trait TupleRefRef<'a> { + type RefType: 'a; + fn _ref_tuple(self) -> Self::RefType; +} + +impl<'a, T> TupleRefRef<'a> for &'a T +where + T: TupleRef, +{ + type RefType = T::RefType<'a>; + + fn _ref_tuple(self) -> Self::RefType { + self.ref_tuple() + } +} +impl<'a, T> TupleRefRef<'a> for &'a mut T +where + T: TupleRef, +{ + type RefType = T::MutRefType<'a>; + + fn _ref_tuple(self) -> Self::RefType { + self.mut_tuple() + } +} + #[cfg(test)] mod test { use super::*; @@ -80,6 +117,21 @@ macro_rules! impl_extend_merge { v$(.extend($ids))* } } + #[allow(non_snake_case)] + impl<$($ids,)*> $crate::entity::TupleRef for ($($ids,)*) { + type RefType<'a> = ($(&'a $ids,)*) where Self: 'a; + type MutRefType<'a> = ($(&'a mut $ids,)*) where Self: 'a; + #[allow(clippy::unused_unit)] + fn ref_tuple(&self) -> Self::RefType<'_> { + let ($($ids,)*) = self; + ($($ids,)*) + } + #[allow(clippy::unused_unit)] + fn mut_tuple(&mut self) -> Self::MutRefType<'_> { + let ($($ids,)*) = self; + ($($ids,)*) + } + } }; (expand_trait_type, $tp:ty, ($first:ident $(,$ids:ident)*)) => { impl_extend_merge!(expand_trait_type, <$tp as TupleExtend>::AfterExtend<$first>, ($($ids),*)) diff --git a/src/lib.rs b/src/lib.rs index 2551d39..ee7c98b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,7 +5,7 @@ pub(crate) mod tuple_proc; pub mod prelude { pub use crate::component::{ComponentGet, ComponentPut}; - pub use crate::entity::{TupleExtend, TupleMerge}; + pub use crate::entity::{TupleExtend, TupleMerge, TupleRefRef}; pub use crate::system::system; pub use crate::system::system_wrap; diff --git a/src/tuple_proc.rs b/src/tuple_proc.rs index d636d35..253ec1f 100644 --- a/src/tuple_proc.rs +++ b/src/tuple_proc.rs @@ -39,22 +39,50 @@ macro_rules! cascade_fn { } #[macro_export] -macro_rules! cascade_obj { - (($obj:expr, $val:expr) => $expr:expr) => { - $expr.into_tuple_processor().cascade_obj($obj, $val) - }; +macro_rules! inspect { + ($val:expr => $expr:expr) => {{ + use $crate::IntoTupleProcessor; + use $crate::TupleRefRef; + $expr.into_tuple_processor().apply($val) + }}; } #[macro_export] -macro_rules! cascade_obj_fn { - (ref $expr:expr) => { - |obj, x| cascade_obj!((obj, x) => $expr) +macro_rules! inspect_fn { + (once $expr:expr) => {{ + let __e = $expr; + move |x| { $crate::inspect!(x => __e) } + }}; + ($expr:expr) => {{ + let mut __e = $expr; + fn do_ref_tuple<'a, T: $crate::TupleRefRef<'a>>(a: T) -> T::RefType { + a._ref_tuple() + } + move |x| { $crate::inspect!(do_ref_tuple(x) => &__e) } + }}; +} + +#[macro_export] +macro_rules! mutate_fn { + (once $expr:expr) => { + let __e = $expr; + |x| { $crate::tuple_proc::mutate!(x => __e) } }; ($expr:expr) => { - move |obj, x| cascade_obj!((obj, x) => $expr) + let mut __e = $expr; + |x| { $crate::tuple_proc::mutate!(x => &mut __e) } }; } +#[macro_export] +macro_rules! mutate { + ($val:expr => $expr:expr) => {{ + use $crate::entity::TupleRefRef; + use $crate::IntoTupleProcessor; + $expr.into_tuple_processor().apply($val.mut_tuple()) + }}; +} + #[cfg(test)] mod tests { use crate::*; @@ -295,27 +323,12 @@ macro_rules! impl_tuple_proc { let (r, b) = _E!(e => |($($ids,)*)| self.0($($ids,)*) => NoMerge); r.cascade_merge(b.merge(())) } - } - #[allow(non_snake_case)] - impl TupleProcessFn - where - F: FnOnce(Obj, ($($ids,)*)) -> OType, - { #[system_wrap( - E: ($($ids,)*) + _E: ($($ids,)*) )] - pub fn cascade_obj( - self, - obj: Obj, - e: E, - ) - -> >::Output - where - outof![E]: TupleMerge, - OType: CascadeInto - { - let (r, b) = E!(e => |($($ids,)*)| self.0(obj, ($($ids,)*)) => NoMerge); - r.cascade_merge(b.merge(())) + pub fn apply<_E>(self, e: _E) -> OType { + let (r, _) = _E!(e => |($($ids,)*)| self.0($($ids,)*) => NoMerge); + r } } };