1use std::fmt;
14use std::sync::Arc;
15
16pub mod lock;
18pub mod prelude;
19
20pub use lock::{
21 ArcMutexAccess, ArcRwLockAccess, LockAccess, LockKp, LockKpType, RcRefCellAccess,
22 StdMutexAccess, StdRwLockAccess,
23};
24
25#[cfg(feature = "parking_lot")]
26pub use lock::{
27 DirectParkingLotMutexAccess, DirectParkingLotRwLockAccess, ParkingLotMutexAccess,
28 ParkingLotRwLockAccess,
29};
30
31pub mod async_lock;
33
34#[cfg(feature = "pin_project")]
77pub mod pin;
78
79pub trait KeyPathValueTarget {
83 type Target: Sized;
84}
85impl<T> KeyPathValueTarget for &T {
86 type Target = T;
87}
88impl<T> KeyPathValueTarget for &mut T {
89 type Target = T;
90}
91
92#[macro_export]
94macro_rules! keypath {
95 { $root:ident . $field:ident } => { $root::$field() };
96 { $root:ident . $field:ident . $($ty:ident . $f:ident).+ } => {
97 $root::$field() $(.then($ty::$f()))+
98 };
99 ($root:ident . $field:ident) => { $root::$field() };
100 ($root:ident . $field:ident . $($ty:ident . $f:ident).+) => {
101 $root::$field() $(.then($ty::$f()))+
102 };
103}
104
105#[macro_export]
109macro_rules! get_or {
110 ($kp:expr, $root:expr, $default:expr) => {
111 $kp.get($root).unwrap_or($default)
112 };
113 ($root:expr => $($path:tt)*, $default:expr) => {
114 $crate::get_or!($crate::keypath!($($path)*), $root, $default)
115 };
116}
117
118#[macro_export]
123macro_rules! get_or_else {
124 ($kp:expr, $root:expr, $closure:expr) => {
125 $kp.get($root).map(|r| r.clone()).unwrap_or_else($closure)
126 };
127 ($root:expr => ($($path:tt)*), $closure:expr) => {
128 $crate::get_or_else!($crate::keypath!($($path)*), $root, $closure)
129 };
130}
131
132#[macro_export]
153macro_rules! zip_with_kp {
154 ($root:expr, $closure:expr => $kp1:expr, $kp2:expr) => {
155 match ($kp1.get($root), $kp2.get($root)) {
156 (Some(__a), Some(__b)) => Some($closure((__a, __b))),
157 _ => None,
158 }
159 };
160 ($root:expr, $closure:expr => $kp1:expr, $kp2:expr, $kp3:expr) => {
161 match ($kp1.get($root), $kp2.get($root), $kp3.get($root)) {
162 (Some(__a), Some(__b), Some(__c)) => Some($closure((__a, __b, __c))),
163 _ => None,
164 }
165 };
166 ($root:expr, $closure:expr => $kp1:expr, $kp2:expr, $kp3:expr, $kp4:expr) => {
167 match (
168 $kp1.get($root),
169 $kp2.get($root),
170 $kp3.get($root),
171 $kp4.get($root),
172 ) {
173 (Some(__a), Some(__b), Some(__c), Some(__d)) => Some($closure((__a, __b, __c, __d))),
174 _ => None,
175 }
176 };
177 ($root:expr, $closure:expr => $kp1:expr, $kp2:expr, $kp3:expr, $kp4:expr, $kp5:expr) => {
178 match (
179 $kp1.get($root),
180 $kp2.get($root),
181 $kp3.get($root),
182 $kp4.get($root),
183 $kp5.get($root),
184 ) {
185 (Some(__a), Some(__b), Some(__c), Some(__d), Some(__e)) => {
186 Some($closure((__a, __b, __c, __d, __e)))
187 }
188 _ => None,
189 }
190 };
191 ($root:expr, $closure:expr => $kp1:expr, $kp2:expr, $kp3:expr, $kp4:expr, $kp5:expr, $kp6:expr) => {
192 match (
193 $kp1.get($root),
194 $kp2.get($root),
195 $kp3.get($root),
196 $kp4.get($root),
197 $kp5.get($root),
198 $kp6.get($root),
199 ) {
200 (Some(__a), Some(__b), Some(__c), Some(__d), Some(__e), Some(__f)) => {
201 Some($closure((__a, __b, __c, __d, __e, __f)))
202 }
203 _ => None,
204 }
205 };
206}
207
208pub type KpValue<'a, R, V> = Kp<
210 R,
211 V,
212 &'a R,
213 V, &'a mut R,
215 V, for<'b> fn(&'b R) -> Option<V>,
217 for<'b> fn(&'b mut R) -> Option<V>,
218>;
219
220pub type KpOwned<R, V> = Kp<
222 R,
223 V,
224 R,
225 V, R,
227 V, fn(R) -> Option<V>,
229 fn(R) -> Option<V>,
230>;
231
232pub type KpRoot<R> = Kp<
234 R,
235 R,
236 R,
237 R, R,
239 R, fn(R) -> Option<R>,
241 fn(R) -> Option<R>,
242>;
243
244pub type KpVoid = Kp<(), (), (), (), (), (), fn() -> Option<()>, fn() -> Option<()>>;
246
247pub type KpDynamic<R, V> = Kp<
248 R,
249 V,
250 &'static R,
251 &'static V,
252 &'static mut R,
253 &'static mut V,
254 Box<dyn for<'a> Fn(&'a R) -> Option<&'a V> + Send + Sync>,
255 Box<dyn for<'a> Fn(&'a mut R) -> Option<&'a mut V> + Send + Sync>,
256>;
257
258pub type KpBox<'a, R, V> = Kp<
259 R,
260 V,
261 &'a R,
262 &'a V,
263 &'a mut R,
264 &'a mut V,
265 Box<dyn Fn(&'a R) -> Option<&'a V> + 'a>,
266 Box<dyn Fn(&'a mut R) -> Option<&'a mut V> + 'a>,
267>;
268
269pub type KpArc<'a, R, V> = Kp<
270 R,
271 V,
272 &'a R,
273 &'a V,
274 &'a mut R,
275 &'a mut V,
276 Arc<dyn Fn(&'a R) -> Option<&'a V> + Send + Sync + 'a>,
277 Arc<dyn Fn(&'a mut R) -> Option<&'a mut V> + Send + Sync + 'a>,
278>;
279
280pub type KpType<'a, R, V> = Kp<
281 R,
282 V,
283 &'a R,
284 &'a V,
285 &'a mut R,
286 &'a mut V,
287 for<'b> fn(&'b R) -> Option<&'b V>,
288 for<'b> fn(&'b mut R) -> Option<&'b mut V>,
289>;
290
291pub type KpTraitType<'a, R, V> = dyn KpTrait<
292 R,
293 V,
294 &'a R,
295 &'a V,
296 &'a mut R,
297 &'a mut V,
298 for<'b> fn(&'b R) -> Option<&'b V>,
299 for<'b> fn(&'b mut R) -> Option<&'b mut V>,
300 >;
301
302pub type KpOptionRefCellType<'a, R, V> = Kp<
305 R,
306 V,
307 &'a R,
308 std::cell::Ref<'a, V>,
309 &'a mut R,
310 std::cell::RefMut<'a, V>,
311 for<'b> fn(&'b R) -> Option<std::cell::Ref<'b, V>>,
312 for<'b> fn(&'b mut R) -> Option<std::cell::RefMut<'b, V>>,
313>;
314
315impl<'a, R, V> KpType<'a, R, V>
316where
317 'a: 'static,
318{
319 #[inline]
322 pub fn to_dynamic(self) -> KpDynamic<R, V> {
323 self.into()
324 }
325}
326
327impl<'a, R, V> From<KpType<'a, R, V>> for KpDynamic<R, V>
328{
329 #[inline]
330 fn from(kp: KpType<'a, R, V>) -> Self {
331 let get_fn = kp.get;
332 let set_fn = kp.set;
333 Kp::new(
334 Box::new(move |t: &R| get_fn(t)),
335 Box::new(move |t: &mut R| set_fn(t)),
336 )
337 }
338}
339
340pub type KpComposed<R, V> = Kp<
376 R,
377 V,
378 &'static R,
379 &'static V,
380 &'static mut R,
381 &'static mut V,
382 Box<dyn for<'b> Fn(&'b R) -> Option<&'b V> + Send + Sync>,
383 Box<dyn for<'b> Fn(&'b mut R) -> Option<&'b mut V> + Send + Sync>,
384>;
385
386impl<R, V>
387 Kp<
388 R,
389 V,
390 &'static R,
391 &'static V,
392 &'static mut R,
393 &'static mut V,
394 Box<dyn for<'b> Fn(&'b R) -> Option<&'b V> + Send + Sync>,
395 Box<dyn for<'b> Fn(&'b mut R) -> Option<&'b mut V> + Send + Sync>,
396 >
397{
398 pub fn from_closures<G, S>(get: G, set: S) -> Self
401 where
402 G: for<'b> Fn(&'b R) -> Option<&'b V> + Send + Sync + 'static,
403 S: for<'b> Fn(&'b mut R) -> Option<&'b mut V> + Send + Sync + 'static,
404 {
405 Self::new(Box::new(get), Box::new(set))
406 }
407}
408
409pub struct AKp {
410 getter: Rc<dyn for<'r> Fn(&'r dyn Any) -> Option<&'r dyn Any>>,
411 root_type_id: TypeId,
412 value_type_id: TypeId,
413}
414
415impl AKp {
416 pub fn new<'a, R, V>(keypath: KpType<'a, R, V>) -> Self
418 where
419 R: Any + 'static,
420 V: Any + 'static,
421 {
422 let root_type_id = TypeId::of::<R>();
423 let value_type_id = TypeId::of::<V>();
424 let getter_fn = keypath.get;
425
426 Self {
427 getter: Rc::new(move |any: &dyn Any| {
428 if let Some(root) = any.downcast_ref::<R>() {
429 getter_fn(root).map(|value: &V| value as &dyn Any)
430 } else {
431 None
432 }
433 }),
434 root_type_id,
435 value_type_id,
436 }
437 }
438
439 pub fn from<'a, R, V>(keypath: KpType<'a, R, V>) -> Self
441 where
442 R: Any + 'static,
443 V: Any + 'static,
444 {
445 Self::new(keypath)
446 }
447
448 pub fn get<'r>(&self, root: &'r dyn Any) -> Option<&'r dyn Any> {
450 (self.getter)(root)
451 }
452
453 pub fn root_type_id(&self) -> TypeId {
455 self.root_type_id
456 }
457
458 pub fn value_type_id(&self) -> TypeId {
460 self.value_type_id
461 }
462
463 pub fn get_as<'a, Root: Any, Value: Any>(&self, root: &'a Root) -> Option<Option<&'a Value>> {
465 if self.root_type_id == TypeId::of::<Root>() && self.value_type_id == TypeId::of::<Value>()
466 {
467 Some(
468 self.get(root as &dyn Any)
469 .and_then(|any| any.downcast_ref::<Value>()),
470 )
471 } else {
472 None
473 }
474 }
475
476 pub fn kind_name(&self) -> String {
478 format!("{:?}", self.value_type_id)
479 }
480
481 pub fn root_kind_name(&self) -> String {
483 format!("{:?}", self.root_type_id)
484 }
485
486 pub fn for_arc<Root>(&self) -> AKp
488 where
489 Root: Any + 'static,
490 {
491 let value_type_id = self.value_type_id;
492 let getter = self.getter.clone();
493
494 AKp {
495 getter: Rc::new(move |any: &dyn Any| {
496 if let Some(arc) = any.downcast_ref::<Arc<Root>>() {
497 getter(arc.as_ref() as &dyn Any)
498 } else {
499 None
500 }
501 }),
502 root_type_id: TypeId::of::<Arc<Root>>(),
503 value_type_id,
504 }
505 }
506
507 pub fn for_box<Root>(&self) -> AKp
509 where
510 Root: Any + 'static,
511 {
512 let value_type_id = self.value_type_id;
513 let getter = self.getter.clone();
514
515 AKp {
516 getter: Rc::new(move |any: &dyn Any| {
517 if let Some(boxed) = any.downcast_ref::<Box<Root>>() {
518 getter(boxed.as_ref() as &dyn Any)
519 } else {
520 None
521 }
522 }),
523 root_type_id: TypeId::of::<Box<Root>>(),
524 value_type_id,
525 }
526 }
527
528 pub fn for_rc<Root>(&self) -> AKp
530 where
531 Root: Any + 'static,
532 {
533 let value_type_id = self.value_type_id;
534 let getter = self.getter.clone();
535
536 AKp {
537 getter: Rc::new(move |any: &dyn Any| {
538 if let Some(rc) = any.downcast_ref::<Rc<Root>>() {
539 getter(rc.as_ref() as &dyn Any)
540 } else {
541 None
542 }
543 }),
544 root_type_id: TypeId::of::<Rc<Root>>(),
545 value_type_id,
546 }
547 }
548
549 pub fn for_option<Root>(&self) -> AKp
551 where
552 Root: Any + 'static,
553 {
554 let value_type_id = self.value_type_id;
555 let getter = self.getter.clone();
556
557 AKp {
558 getter: Rc::new(move |any: &dyn Any| {
559 if let Some(opt) = any.downcast_ref::<Option<Root>>() {
560 opt.as_ref().and_then(|root| getter(root as &dyn Any))
561 } else {
562 None
563 }
564 }),
565 root_type_id: TypeId::of::<Option<Root>>(),
566 value_type_id,
567 }
568 }
569
570 pub fn for_result<Root, E>(&self) -> AKp
572 where
573 Root: Any + 'static,
574 E: Any + 'static,
575 {
576 let value_type_id = self.value_type_id;
577 let getter = self.getter.clone();
578
579 AKp {
580 getter: Rc::new(move |any: &dyn Any| {
581 if let Some(result) = any.downcast_ref::<Result<Root, E>>() {
582 result
583 .as_ref()
584 .ok()
585 .and_then(|root| getter(root as &dyn Any))
586 } else {
587 None
588 }
589 }),
590 root_type_id: TypeId::of::<Result<Root, E>>(),
591 value_type_id,
592 }
593 }
594
595 pub fn map<Root, OrigValue, MappedValue, F>(&self, mapper: F) -> AKp
608 where
609 Root: Any + 'static,
610 OrigValue: Any + 'static,
611 MappedValue: Any + 'static,
612 F: Fn(&OrigValue) -> MappedValue + 'static,
613 {
614 let orig_root_type_id = self.root_type_id;
615 let orig_value_type_id = self.value_type_id;
616 let getter = self.getter.clone();
617 let mapped_type_id = TypeId::of::<MappedValue>();
618
619 AKp {
620 getter: Rc::new(move |any_root: &dyn Any| {
621 if any_root.type_id() == orig_root_type_id {
623 getter(any_root).and_then(|any_value| {
624 if orig_value_type_id == TypeId::of::<OrigValue>() {
626 any_value.downcast_ref::<OrigValue>().map(|orig_val| {
627 let mapped = mapper(orig_val);
628 Box::leak(Box::new(mapped)) as &dyn Any
630 })
631 } else {
632 None
633 }
634 })
635 } else {
636 None
637 }
638 }),
639 root_type_id: orig_root_type_id,
640 value_type_id: mapped_type_id,
641 }
642 }
643
644 pub fn filter<Root, Value, F>(&self, predicate: F) -> AKp
657 where
658 Root: Any + 'static,
659 Value: Any + 'static,
660 F: Fn(&Value) -> bool + 'static,
661 {
662 let orig_root_type_id = self.root_type_id;
663 let orig_value_type_id = self.value_type_id;
664 let getter = self.getter.clone();
665
666 AKp {
667 getter: Rc::new(move |any_root: &dyn Any| {
668 if any_root.type_id() == orig_root_type_id {
670 getter(any_root).filter(|any_value| {
671 if orig_value_type_id == TypeId::of::<Value>() {
673 any_value
674 .downcast_ref::<Value>()
675 .map(|val| predicate(val))
676 .unwrap_or(false)
677 } else {
678 false
679 }
680 })
681 } else {
682 None
683 }
684 }),
685 root_type_id: orig_root_type_id,
686 value_type_id: orig_value_type_id,
687 }
688 }
689}
690
691impl fmt::Debug for AKp {
692 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
693 f.debug_struct("AKp")
694 .field("root_type_id", &self.root_type_id)
695 .field("value_type_id", &self.value_type_id)
696 .finish_non_exhaustive()
697 }
698}
699
700impl fmt::Display for AKp {
701 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
702 write!(
703 f,
704 "AKp(root_type_id={:?}, value_type_id={:?})",
705 self.root_type_id, self.value_type_id
706 )
707 }
708}
709
710pub struct PKp<Root> {
711 getter: Rc<dyn for<'r> Fn(&'r Root) -> Option<&'r dyn Any>>,
712 value_type_id: TypeId,
713 _phantom: std::marker::PhantomData<Root>,
714}
715
716impl<Root> PKp<Root>
717where
718 Root: 'static,
719{
720 pub fn new<'a, V>(keypath: KpType<'a, Root, V>) -> Self
722 where
723 V: Any + 'static,
724 {
725 let value_type_id = TypeId::of::<V>();
726 let getter_fn = keypath.get;
727
728 Self {
729 getter: Rc::new(move |root: &Root| getter_fn(root).map(|val: &V| val as &dyn Any)),
730 value_type_id,
731 _phantom: std::marker::PhantomData,
732 }
733 }
734
735 pub fn from<'a, V>(keypath: KpType<'a, Root, V>) -> Self
737 where
738 V: Any + 'static,
739 {
740 Self::new(keypath)
741 }
742
743 pub fn get<'r>(&self, root: &'r Root) -> Option<&'r dyn Any> {
745 (self.getter)(root)
746 }
747
748 pub fn value_type_id(&self) -> TypeId {
750 self.value_type_id
751 }
752
753 pub fn get_as<'a, Value: Any>(&self, root: &'a Root) -> Option<&'a Value> {
755 if self.value_type_id == TypeId::of::<Value>() {
756 self.get(root).and_then(|any| any.downcast_ref::<Value>())
757 } else {
758 None
759 }
760 }
761
762 pub fn kind_name(&self) -> String {
764 format!("{:?}", self.value_type_id)
765 }
766
767 pub fn for_arc(&self) -> PKp<Arc<Root>> {
769 let getter = self.getter.clone();
770 let value_type_id = self.value_type_id;
771
772 PKp {
773 getter: Rc::new(move |arc: &Arc<Root>| getter(arc.as_ref())),
774 value_type_id,
775 _phantom: std::marker::PhantomData,
776 }
777 }
778
779 pub fn for_box(&self) -> PKp<Box<Root>> {
781 let getter = self.getter.clone();
782 let value_type_id = self.value_type_id;
783
784 PKp {
785 getter: Rc::new(move |boxed: &Box<Root>| getter(boxed.as_ref())),
786 value_type_id,
787 _phantom: std::marker::PhantomData,
788 }
789 }
790
791 pub fn for_rc(&self) -> PKp<Rc<Root>> {
793 let getter = self.getter.clone();
794 let value_type_id = self.value_type_id;
795
796 PKp {
797 getter: Rc::new(move |rc: &Rc<Root>| getter(rc.as_ref())),
798 value_type_id,
799 _phantom: std::marker::PhantomData,
800 }
801 }
802
803 pub fn for_option(&self) -> PKp<Option<Root>> {
805 let getter = self.getter.clone();
806 let value_type_id = self.value_type_id;
807
808 PKp {
809 getter: Rc::new(move |opt: &Option<Root>| opt.as_ref().and_then(|root| getter(root))),
810 value_type_id,
811 _phantom: std::marker::PhantomData,
812 }
813 }
814
815 pub fn for_result<E>(&self) -> PKp<Result<Root, E>>
817 where
818 E: 'static,
819 {
820 let getter = self.getter.clone();
821 let value_type_id = self.value_type_id;
822
823 PKp {
824 getter: Rc::new(move |result: &Result<Root, E>| {
825 result.as_ref().ok().and_then(|root| getter(root))
826 }),
827 value_type_id,
828 _phantom: std::marker::PhantomData,
829 }
830 }
831
832 pub fn map<OrigValue, MappedValue, F>(&self, mapper: F) -> PKp<Root>
846 where
847 OrigValue: Any + 'static,
848 MappedValue: Any + 'static,
849 F: Fn(&OrigValue) -> MappedValue + 'static,
850 {
851 let orig_type_id = self.value_type_id;
852 let getter = self.getter.clone();
853 let mapped_type_id = TypeId::of::<MappedValue>();
854
855 PKp {
856 getter: Rc::new(move |root: &Root| {
857 getter(root).and_then(|any_value| {
858 if orig_type_id == TypeId::of::<OrigValue>() {
860 any_value.downcast_ref::<OrigValue>().map(|orig_val| {
861 let mapped = mapper(orig_val);
862 Box::leak(Box::new(mapped)) as &dyn Any
865 })
866 } else {
867 None
868 }
869 })
870 }),
871 value_type_id: mapped_type_id,
872 _phantom: std::marker::PhantomData,
873 }
874 }
875
876 pub fn filter<Value, F>(&self, predicate: F) -> PKp<Root>
890 where
891 Value: Any + 'static,
892 F: Fn(&Value) -> bool + 'static,
893 {
894 let orig_type_id = self.value_type_id;
895 let getter = self.getter.clone();
896
897 PKp {
898 getter: Rc::new(move |root: &Root| {
899 getter(root).filter(|any_value| {
900 if orig_type_id == TypeId::of::<Value>() {
902 any_value
903 .downcast_ref::<Value>()
904 .map(|val| predicate(val))
905 .unwrap_or(false)
906 } else {
907 false
908 }
909 })
910 }),
911 value_type_id: orig_type_id,
912 _phantom: std::marker::PhantomData,
913 }
914 }
915}
916
917impl<Root> fmt::Debug for PKp<Root> {
918 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
919 f.debug_struct("PKp")
920 .field("root_ty", &std::any::type_name::<Root>())
921 .field("value_type_id", &self.value_type_id)
922 .finish_non_exhaustive()
923 }
924}
925
926impl<Root> fmt::Display for PKp<Root> {
927 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
928 write!(
929 f,
930 "PKp<{}, value_type_id={:?}>",
931 std::any::type_name::<Root>(),
932 self.value_type_id
933 )
934 }
935}
936
937pub trait KpTrait<R, V, Root, Value, MutRoot, MutValue, G, S> {
940 fn type_id_of_root() -> TypeId
941 where
942 R: 'static,
943 {
944 std::any::TypeId::of::<R>()
945 }
946 fn type_id_of_value() -> TypeId
947 where
948 V: 'static,
949 {
950 std::any::TypeId::of::<V>()
951 }
952 fn get(&self, root: Root) -> Option<Value>;
953 fn get_mut(&self, root: MutRoot) -> Option<MutValue>;
954 fn then<SV, SubValue, MutSubValue, G2, S2>(
955 self,
956 next: Kp<V, SV, Value, SubValue, MutValue, MutSubValue, G2, S2>,
957 ) -> Kp<
958 R,
959 SV,
960 Root,
961 SubValue,
962 MutRoot,
963 MutSubValue,
964 impl Fn(Root) -> Option<SubValue>,
965 impl Fn(MutRoot) -> Option<MutSubValue>,
966 >
967 where
968 Self: Sized,
969 Root: std::borrow::Borrow<R>,
970 Value: std::borrow::Borrow<V>,
971 MutRoot: std::borrow::BorrowMut<R>,
972 MutValue: std::borrow::BorrowMut<V>,
973 SubValue: std::borrow::Borrow<SV>,
974 MutSubValue: std::borrow::BorrowMut<SV>,
975 G2: Fn(Value) -> Option<SubValue>,
976 S2: Fn(MutValue) -> Option<MutSubValue>,;
977}
978
979pub trait ChainExt<R, V, Root, Value, MutRoot, MutValue> {
980 fn then_lock<
982 Lock,
983 Mid,
984 V2,
985 LockValue,
986 MidValue,
987 Value2,
988 MutLock,
989 MutMid,
990 MutValue2,
991 G1,
992 S1,
993 L,
994 G2,
995 S2,
996 >(
997 self,
998 lock_kp: crate::lock::LockKp<
999 V,
1000 Lock,
1001 Mid,
1002 V2,
1003 Value,
1004 LockValue,
1005 MidValue,
1006 Value2,
1007 MutValue,
1008 MutLock,
1009 MutMid,
1010 MutValue2,
1011 G1,
1012 S1,
1013 L,
1014 G2,
1015 S2,
1016 >,
1017 ) -> crate::lock::KpThenLockKp<
1018 R,
1019 V,
1020 V2,
1021 Root,
1022 Value,
1023 Value2,
1024 MutRoot,
1025 MutValue,
1026 MutValue2,
1027 Self,
1028 crate::lock::LockKp<
1029 V,
1030 Lock,
1031 Mid,
1032 V2,
1033 Value,
1034 LockValue,
1035 MidValue,
1036 Value2,
1037 MutValue,
1038 MutLock,
1039 MutMid,
1040 MutValue2,
1041 G1,
1042 S1,
1043 L,
1044 G2,
1045 S2,
1046 >,
1047 >
1048 where
1049 V: 'static + Clone,
1050 V2: 'static,
1051 Value: std::borrow::Borrow<V>,
1052 Value2: std::borrow::Borrow<V2>,
1053 MutValue: std::borrow::BorrowMut<V>,
1054 MutValue2: std::borrow::BorrowMut<V2>,
1055 LockValue: std::borrow::Borrow<Lock>,
1056 MidValue: std::borrow::Borrow<Mid>,
1057 MutLock: std::borrow::BorrowMut<Lock>,
1058 MutMid: std::borrow::BorrowMut<Mid>,
1059 G1: Fn(Value) -> Option<LockValue>,
1060 S1: Fn(MutValue) -> Option<MutLock>,
1061 L: crate::lock::LockAccess<Lock, MidValue> + crate::lock::LockAccess<Lock, MutMid>,
1062 G2: Fn(MidValue) -> Option<Value2>,
1063 S2: Fn(MutMid) -> Option<MutValue2>,
1064 Self: Sized;
1065
1066 #[cfg(feature = "pin_project")]
1068 fn then_pin_future<Struct, Output, L>(
1069 self,
1070 pin_fut: L,
1071 ) -> crate::pin::KpThenPinFuture<R, Struct, Output, Root, MutRoot, Value, MutValue, Self, L>
1072 where
1073 Struct: Unpin + 'static,
1074 Output: 'static,
1075 Value: std::borrow::Borrow<Struct>,
1076 MutValue: std::borrow::BorrowMut<Struct>,
1077 L: crate::pin::PinFutureAwaitLike<Struct, Output> + Sync,
1078 Self: Sized;
1079
1080 fn then_async<AsyncKp>(
1082 self,
1083 async_kp: AsyncKp,
1084 ) -> crate::async_lock::KpThenAsyncKeyPath<
1085 R,
1086 V,
1087 <AsyncKp::Value as KeyPathValueTarget>::Target,
1088 Root,
1089 Value,
1090 AsyncKp::Value,
1091 MutRoot,
1092 MutValue,
1093 AsyncKp::MutValue,
1094 Self,
1095 AsyncKp,
1096 >
1097 where
1098 Value: std::borrow::Borrow<V>,
1099 MutValue: std::borrow::BorrowMut<V>,
1100 AsyncKp: crate::async_lock::AsyncKeyPathLike<Value, MutValue>,
1101 AsyncKp::Value: KeyPathValueTarget
1102 + std::borrow::Borrow<<AsyncKp::Value as KeyPathValueTarget>::Target>,
1103 AsyncKp::MutValue: std::borrow::BorrowMut<<AsyncKp::Value as KeyPathValueTarget>::Target>,
1104 <AsyncKp::Value as KeyPathValueTarget>::Target: 'static,
1105 Self: Sized;
1106}
1107
1108impl<R, V, Root, Value, MutRoot, MutValue, G, S> ChainExt<R, V, Root, Value, MutRoot, MutValue>
1109 for Kp<R, V, Root, Value, MutRoot, MutValue, G, S>
1110where
1111 Root: std::borrow::Borrow<R>,
1112 Value: std::borrow::Borrow<V>,
1113 MutRoot: std::borrow::BorrowMut<R>,
1114 MutValue: std::borrow::BorrowMut<V>,
1115 G: Fn(Root) -> Option<Value>,
1116 S: Fn(MutRoot) -> Option<MutValue>,
1117{
1118 fn then_lock<
1119 Lock,
1120 Mid,
1121 V2,
1122 LockValue,
1123 MidValue,
1124 Value2,
1125 MutLock,
1126 MutMid,
1127 MutValue2,
1128 G1,
1129 S1,
1130 L,
1131 G2,
1132 S2,
1133 >(
1134 self,
1135 lock_kp: crate::lock::LockKp<
1136 V,
1137 Lock,
1138 Mid,
1139 V2,
1140 Value,
1141 LockValue,
1142 MidValue,
1143 Value2,
1144 MutValue,
1145 MutLock,
1146 MutMid,
1147 MutValue2,
1148 G1,
1149 S1,
1150 L,
1151 G2,
1152 S2,
1153 >,
1154 ) -> crate::lock::KpThenLockKp<
1155 R,
1156 V,
1157 V2,
1158 Root,
1159 Value,
1160 Value2,
1161 MutRoot,
1162 MutValue,
1163 MutValue2,
1164 Self,
1165 crate::lock::LockKp<
1166 V,
1167 Lock,
1168 Mid,
1169 V2,
1170 Value,
1171 LockValue,
1172 MidValue,
1173 Value2,
1174 MutValue,
1175 MutLock,
1176 MutMid,
1177 MutValue2,
1178 G1,
1179 S1,
1180 L,
1181 G2,
1182 S2,
1183 >,
1184 >
1185 where
1186 V: 'static + Clone,
1187 V2: 'static,
1188 Value: std::borrow::Borrow<V>,
1189 Value2: std::borrow::Borrow<V2>,
1190 MutValue: std::borrow::BorrowMut<V>,
1191 MutValue2: std::borrow::BorrowMut<V2>,
1192 LockValue: std::borrow::Borrow<Lock>,
1193 MidValue: std::borrow::Borrow<Mid>,
1194 MutLock: std::borrow::BorrowMut<Lock>,
1195 MutMid: std::borrow::BorrowMut<Mid>,
1196 G1: Fn(Value) -> Option<LockValue>,
1197 S1: Fn(MutValue) -> Option<MutLock>,
1198 L: crate::lock::LockAccess<Lock, MidValue> + crate::lock::LockAccess<Lock, MutMid>,
1199 G2: Fn(MidValue) -> Option<Value2>,
1200 S2: Fn(MutMid) -> Option<MutValue2>,
1201 {
1202 crate::lock::KpThenLockKp {
1203 first: self,
1204 second: lock_kp,
1205 _p: std::marker::PhantomData,
1206 }
1207 }
1208
1209 #[cfg(feature = "pin_project")]
1210 fn then_pin_future<Struct, Output, L>(
1211 self,
1212 pin_fut: L,
1213 ) -> crate::pin::KpThenPinFuture<R, Struct, Output, Root, MutRoot, Value, MutValue, Self, L>
1214 where
1215 Struct: Unpin + 'static,
1216 Output: 'static,
1217 Value: std::borrow::Borrow<Struct>,
1218 MutValue: std::borrow::BorrowMut<Struct>,
1219 L: crate::pin::PinFutureAwaitLike<Struct, Output> + Sync,
1220 {
1221 crate::pin::KpThenPinFuture {
1222 first: self,
1223 second: pin_fut,
1224 _p: std::marker::PhantomData,
1225 }
1226 }
1227
1228 fn then_async<AsyncKp>(
1229 self,
1230 async_kp: AsyncKp,
1231 ) -> crate::async_lock::KpThenAsyncKeyPath<
1232 R,
1233 V,
1234 <AsyncKp::Value as KeyPathValueTarget>::Target,
1235 Root,
1236 Value,
1237 AsyncKp::Value,
1238 MutRoot,
1239 MutValue,
1240 AsyncKp::MutValue,
1241 Self,
1242 AsyncKp,
1243 >
1244 where
1245 Value: std::borrow::Borrow<V>,
1246 MutValue: std::borrow::BorrowMut<V>,
1247 AsyncKp: crate::async_lock::AsyncKeyPathLike<Value, MutValue>,
1248 AsyncKp::Value: KeyPathValueTarget
1249 + std::borrow::Borrow<<AsyncKp::Value as KeyPathValueTarget>::Target>,
1250 AsyncKp::MutValue: std::borrow::BorrowMut<<AsyncKp::Value as KeyPathValueTarget>::Target>,
1251 <AsyncKp::Value as KeyPathValueTarget>::Target: 'static,
1252 {
1253 crate::async_lock::KpThenAsyncKeyPath {
1254 first: self,
1255 second: async_kp,
1256 _p: std::marker::PhantomData,
1257 }
1258 }
1259}
1260
1261pub trait AccessorTrait<R, V, Root, Value, MutRoot, MutValue, G, S> {
1262 fn get_optional(&self, root: Option<Root>) -> Option<Value>;
1264 fn get_mut_optional(&self, root: Option<MutRoot>) -> Option<MutValue>;
1270 fn get_or_else<F>(&self, root: Root, f: F) -> Value
1276 where
1277 F: FnOnce() -> Value;
1278 #[inline]
1284 fn get_mut_or_else<F>(&self, root: MutRoot, f: F) -> MutValue
1285 where
1286 F: FnOnce() -> MutValue;
1287 }
1291
1292pub trait CoercionTrait<R, V, Root, Value, MutRoot, MutValue, G, S>
1293where
1294 Root: std::borrow::Borrow<R>,
1295 Value: std::borrow::Borrow<V>,
1296 MutRoot: std::borrow::BorrowMut<R>,
1297 MutValue: std::borrow::BorrowMut<V>,
1298 G: Fn(Root) -> Option<Value>,
1299 S: Fn(MutRoot) -> Option<MutValue>,
1300{
1301 fn for_arc<'b>(
1302 &self,
1303 ) -> Kp<
1304 std::sync::Arc<R>,
1305 V,
1306 std::sync::Arc<R>,
1307 Value,
1308 std::sync::Arc<R>,
1309 MutValue,
1310 impl Fn(std::sync::Arc<R>) -> Option<Value>,
1311 impl Fn(std::sync::Arc<R>) -> Option<MutValue>,
1312 >
1313 where
1314 R: 'b,
1315 V: 'b,
1316 Root: for<'a> From<&'a R>,
1317 MutRoot: for<'a> From<&'a mut R>;
1318
1319 fn for_box<'a>(
1320 &self,
1321 ) -> Kp<
1322 Box<R>,
1323 V,
1324 Box<R>,
1325 Value,
1326 Box<R>,
1327 MutValue,
1328 impl Fn(Box<R>) -> Option<Value>,
1329 impl Fn(Box<R>) -> Option<MutValue>,
1330 >
1331 where
1332 R: 'a,
1333 V: 'a,
1334 Root: for<'b> From<&'b R>,
1335 MutRoot: for<'b> From<&'b mut R>;
1336
1337 fn into_set(self) -> impl Fn(MutRoot) -> Option<MutValue>;
1339
1340 fn into_get(self) -> impl Fn(Root) -> Option<Value>;
1342}
1343
1344pub trait HofTrait<R, V, Root, Value, MutRoot, MutValue, G, S>:
1345 KpTrait<R, V, Root, Value, MutRoot, MutValue, G, S>
1346where
1347 Root: std::borrow::Borrow<R>,
1348 Value: std::borrow::Borrow<V>,
1349 MutRoot: std::borrow::BorrowMut<R>,
1350 MutValue: std::borrow::BorrowMut<V>,
1351 G: Fn(Root) -> Option<Value>,
1352 S: Fn(MutRoot) -> Option<MutValue>,
1353{
1354 fn map<MappedValue, F>(
1404 &self,
1405 mapper: F,
1406 ) -> Kp<
1407 R,
1408 MappedValue,
1409 Root,
1410 MappedValue,
1411 MutRoot,
1412 MappedValue,
1413 impl Fn(Root) -> Option<MappedValue> + '_,
1414 impl Fn(MutRoot) -> Option<MappedValue> + '_,
1415 >
1416 where
1417 F: Fn(&V) -> MappedValue + Copy + 'static,
1418 MappedValue: 'static,
1419 {
1420 Kp::new(
1421 move |root: Root| {
1422 self.get(root).map(|value| {
1423 let v: &V = value.borrow();
1424 mapper(v)
1425 })
1426 },
1427 move |root: MutRoot| {
1428 self.get_mut(root).map(|value| {
1429 let v: &V = value.borrow();
1430 mapper(v)
1431 })
1432 },
1433 )
1434 }
1435
1436 fn filter<F>(
1438 &self,
1439 predicate: F,
1440 ) -> Kp<
1441 R,
1442 V,
1443 Root,
1444 Value,
1445 MutRoot,
1446 MutValue,
1447 impl Fn(Root) -> Option<Value> + '_,
1448 impl Fn(MutRoot) -> Option<MutValue> + '_,
1449 >
1450 where
1451 F: Fn(&V) -> bool + Copy + 'static,
1452 {
1453 Kp::new(
1454 move |root: Root| {
1455 self.get(root).filter(|value| {
1456 let v: &V = value.borrow();
1457 predicate(v)
1458 })
1459 },
1460 move |root: MutRoot| {
1461 self.get_mut(root).filter(|value| {
1462 let v: &V = value.borrow();
1463 predicate(v)
1464 })
1465 },
1466 )
1467 }
1468
1469 fn filter_map<MappedValue, F>(
1471 &self,
1472 mapper: F,
1473 ) -> Kp<
1474 R,
1475 MappedValue,
1476 Root,
1477 MappedValue,
1478 MutRoot,
1479 MappedValue,
1480 impl Fn(Root) -> Option<MappedValue> + '_,
1481 impl Fn(MutRoot) -> Option<MappedValue> + '_,
1482 >
1483 where
1484 F: Fn(&V) -> Option<MappedValue> + Copy + 'static,
1485 {
1486 Kp::new(
1487 move |root: Root| {
1488 self.get(root).and_then(|value| {
1489 let v: &V = value.borrow();
1490 mapper(v)
1491 })
1492 },
1493 move |root: MutRoot| {
1494 self.get_mut(root).and_then(|value| {
1495 let v: &V = value.borrow();
1496 mapper(v)
1497 })
1498 },
1499 )
1500 }
1501
1502 fn inspect<F>(
1504 &self,
1505 inspector: F,
1506 ) -> Kp<
1507 R,
1508 V,
1509 Root,
1510 Value,
1511 MutRoot,
1512 MutValue,
1513 impl Fn(Root) -> Option<Value> + '_,
1514 impl Fn(MutRoot) -> Option<MutValue> + '_,
1515 >
1516 where
1517 F: Fn(&V) + Copy + 'static,
1518 {
1519 Kp::new(
1520 move |root: Root| {
1521 self.get(root).map(|value| {
1522 let v: &V = value.borrow();
1523 inspector(v);
1524 value
1525 })
1526 },
1527 move |root: MutRoot| {
1528 self.get_mut(root).map(|value| {
1529 let v: &V = value.borrow();
1530 inspector(v);
1531 value
1532 })
1533 },
1534 )
1535 }
1536
1537 fn flat_map<I, Item, F>(&self, mapper: F) -> impl Fn(Root) -> Vec<Item> + '_
1539 where
1540 F: Fn(&V) -> I + 'static,
1541 I: IntoIterator<Item = Item>,
1542 {
1543 move |root: Root| {
1544 self.get(root)
1545 .map(|value| {
1546 let v: &V = value.borrow();
1547 mapper(v).into_iter().collect()
1548 })
1549 .unwrap_or_else(Vec::new)
1550 }
1551 }
1552
1553 fn fold_value<Acc, F>(&self, init: Acc, folder: F) -> impl Fn(Root) -> Acc + '_
1555 where
1556 F: Fn(Acc, &V) -> Acc + 'static,
1557 Acc: Copy + 'static,
1558 {
1559 move |root: Root| {
1560 self.get(root)
1561 .map(|value| {
1562 let v: &V = value.borrow();
1563 folder(init, v)
1564 })
1565 .unwrap_or(init)
1566 }
1567 }
1568
1569 fn any<F>(&self, predicate: F) -> impl Fn(Root) -> bool + '_
1571 where
1572 F: Fn(&V) -> bool + 'static,
1573 {
1574 move |root: Root| {
1575 self.get(root)
1576 .map(|value| {
1577 let v: &V = value.borrow();
1578 predicate(v)
1579 })
1580 .unwrap_or(false)
1581 }
1582 }
1583
1584 fn all<F>(&self, predicate: F) -> impl Fn(Root) -> bool + '_
1586 where
1587 F: Fn(&V) -> bool + 'static,
1588 {
1589 move |root: Root| {
1590 self.get(root)
1591 .map(|value| {
1592 let v: &V = value.borrow();
1593 predicate(v)
1594 })
1595 .unwrap_or(true)
1596 }
1597 }
1598
1599 fn count_items<F>(&self, counter: F) -> impl Fn(Root) -> Option<usize> + '_
1601 where
1602 F: Fn(&V) -> usize + 'static,
1603 {
1604 move |root: Root| {
1605 self.get(root).map(|value| {
1606 let v: &V = value.borrow();
1607 counter(v)
1608 })
1609 }
1610 }
1611
1612 fn find_in<Item, F>(&self, finder: F) -> impl Fn(Root) -> Option<Item> + '_
1614 where
1615 F: Fn(&V) -> Option<Item> + 'static,
1616 {
1617 move |root: Root| {
1618 self.get(root).and_then(|value| {
1619 let v: &V = value.borrow();
1620 finder(v)
1621 })
1622 }
1623 }
1624
1625 fn take<Output, F>(&self, n: usize, taker: F) -> impl Fn(Root) -> Option<Output> + '_
1627 where
1628 F: Fn(&V, usize) -> Output + 'static,
1629 {
1630 move |root: Root| {
1631 self.get(root).map(|value| {
1632 let v: &V = value.borrow();
1633 taker(v, n)
1634 })
1635 }
1636 }
1637
1638 fn skip<Output, F>(&self, n: usize, skipper: F) -> impl Fn(Root) -> Option<Output> + '_
1640 where
1641 F: Fn(&V, usize) -> Output + 'static,
1642 {
1643 move |root: Root| {
1644 self.get(root).map(|value| {
1645 let v: &V = value.borrow();
1646 skipper(v, n)
1647 })
1648 }
1649 }
1650
1651 fn partition_value<Output, F>(&self, partitioner: F) -> impl Fn(Root) -> Option<Output> + '_
1653 where
1654 F: Fn(&V) -> Output + 'static,
1655 {
1656 move |root: Root| {
1657 self.get(root).map(|value| {
1658 let v: &V = value.borrow();
1659 partitioner(v)
1660 })
1661 }
1662 }
1663
1664 fn min_value<Item, F>(&self, min_fn: F) -> impl Fn(Root) -> Option<Item> + '_
1666 where
1667 F: Fn(&V) -> Option<Item> + 'static,
1668 {
1669 move |root: Root| {
1670 self.get(root).and_then(|value| {
1671 let v: &V = value.borrow();
1672 min_fn(v)
1673 })
1674 }
1675 }
1676
1677 fn max_value<Item, F>(&self, max_fn: F) -> impl Fn(Root) -> Option<Item> + '_
1679 where
1680 F: Fn(&V) -> Option<Item> + 'static,
1681 {
1682 move |root: Root| {
1683 self.get(root).and_then(|value| {
1684 let v: &V = value.borrow();
1685 max_fn(v)
1686 })
1687 }
1688 }
1689
1690 fn sum_value<Sum, F>(&self, sum_fn: F) -> impl Fn(Root) -> Option<Sum> + '_
1692 where
1693 F: Fn(&V) -> Sum + 'static,
1694 {
1695 move |root: Root| {
1696 self.get(root).map(|value| {
1697 let v: &V = value.borrow();
1698 sum_fn(v)
1699 })
1700 }
1701 }
1702
1703 }
1754
1755impl<R, V, Root, Value, MutRoot, MutValue, G, S> KpTrait<R, V, Root, Value, MutRoot, MutValue, G, S>
1756 for Kp<R, V, Root, Value, MutRoot, MutValue, G, S>
1757where
1758 Root: std::borrow::Borrow<R>,
1759 Value: std::borrow::Borrow<V>,
1760 MutRoot: std::borrow::BorrowMut<R>,
1761 MutValue: std::borrow::BorrowMut<V>,
1762 G: Fn(Root) -> Option<Value>,
1763 S: Fn(MutRoot) -> Option<MutValue>,
1764{
1765 fn then<SV, SubValue, MutSubValue, G2, S2>(
1766 self,
1767 next: Kp<V, SV, Value, SubValue, MutValue, MutSubValue, G2, S2>,
1768 ) -> Kp<
1769 R,
1770 SV,
1771 Root,
1772 SubValue,
1773 MutRoot,
1774 MutSubValue,
1775 impl Fn(Root) -> Option<SubValue>,
1776 impl Fn(MutRoot) -> Option<MutSubValue>,
1777 >
1778 where
1779 SubValue: std::borrow::Borrow<SV>,
1780 MutSubValue: std::borrow::BorrowMut<SV>,
1781 G2: Fn(Value) -> Option<SubValue>,
1782 S2: Fn(MutValue) -> Option<MutSubValue>,
1783 {
1784 Kp::new(
1785 move |root: Root| (self.get)(root).and_then(|value| (next.get)(value)),
1786 move |root: MutRoot| (self.set)(root).and_then(|value| (next.set)(value)),
1787 )
1788 }
1789
1790 fn get(&self, root: Root) -> Option<Value> {
1791 (self.get)(root)
1792 }
1793
1794 fn get_mut(&self, root: MutRoot) -> Option<MutValue> {
1795 (self.set)(root)
1796 }
1797}
1798
1799impl<R, V, Root, Value, MutRoot, MutValue, G, S>
1800 CoercionTrait<R, V, Root, Value, MutRoot, MutValue, G, S>
1801 for Kp<R, V, Root, Value, MutRoot, MutValue, G, S>
1802where
1803 Root: std::borrow::Borrow<R>,
1804 Value: std::borrow::Borrow<V>,
1805 MutRoot: std::borrow::BorrowMut<R>,
1806 MutValue: std::borrow::BorrowMut<V>,
1807 G: Fn(Root) -> Option<Value>,
1808 S: Fn(MutRoot) -> Option<MutValue>,
1809{
1810 fn for_arc<'b>(
1811 &self,
1812 ) -> Kp<
1813 std::sync::Arc<R>,
1814 V,
1815 std::sync::Arc<R>,
1816 Value,
1817 std::sync::Arc<R>,
1818 MutValue,
1819 impl Fn(std::sync::Arc<R>) -> Option<Value>,
1820 impl Fn(std::sync::Arc<R>) -> Option<MutValue>,
1821 >
1822 where
1823 R: 'b,
1824 V: 'b,
1825 Root: for<'a> From<&'a R>,
1826 MutRoot: for<'a> From<&'a mut R>,
1827 {
1828 Kp::new(
1829 move |arc_root: std::sync::Arc<R>| {
1830 let r_ref: &R = &*arc_root;
1831 (self.get)(Root::from(r_ref))
1832 },
1833 move |mut arc_root: std::sync::Arc<R>| {
1834 std::sync::Arc::get_mut(&mut arc_root)
1836 .and_then(|r_mut| (self.set)(MutRoot::from(r_mut)))
1837 },
1838 )
1839 }
1840
1841 fn for_box<'a>(
1842 &self,
1843 ) -> Kp<
1844 Box<R>,
1845 V,
1846 Box<R>,
1847 Value,
1848 Box<R>,
1849 MutValue,
1850 impl Fn(Box<R>) -> Option<Value>,
1851 impl Fn(Box<R>) -> Option<MutValue>,
1852 >
1853 where
1854 R: 'a,
1855 V: 'a,
1856 Root: for<'b> From<&'b R>,
1857 MutRoot: for<'b> From<&'b mut R>,
1858 {
1859 Kp::new(
1860 move |r: Box<R>| {
1861 let r_ref: &R = r.as_ref();
1862 (self.get)(Root::from(r_ref))
1863 },
1864 move |mut r: Box<R>| {
1865 (self.set)(MutRoot::from(r.as_mut()))
1867 },
1868 )
1869 }
1870
1871 #[inline]
1873 fn into_set(self) -> impl Fn(MutRoot) -> Option<MutValue> {
1874 self.set
1875 }
1876
1877 #[inline]
1879 fn into_get(self) -> impl Fn(Root) -> Option<Value> {
1880 self.get
1881 }
1882}
1883
1884impl<R, V, Root, Value, MutRoot, MutValue, G, S>
1885 HofTrait<R, V, Root, Value, MutRoot, MutValue, G, S>
1886 for Kp<R, V, Root, Value, MutRoot, MutValue, G, S>
1887where
1888 Root: std::borrow::Borrow<R>,
1889 Value: std::borrow::Borrow<V>,
1890 MutRoot: std::borrow::BorrowMut<R>,
1891 MutValue: std::borrow::BorrowMut<V>,
1892 G: Fn(Root) -> Option<Value>,
1893 S: Fn(MutRoot) -> Option<MutValue>,
1894{
1895}
1896
1897impl<R, V, Root, Value, MutRoot, MutValue, G, S>
1898 AccessorTrait<R, V, Root, Value, MutRoot, MutValue, G, S>
1899 for Kp<R, V, Root, Value, MutRoot, MutValue, G, S>
1900where
1901 Root: std::borrow::Borrow<R>,
1902 Value: std::borrow::Borrow<V>,
1903 MutRoot: std::borrow::BorrowMut<R>,
1904 MutValue: std::borrow::BorrowMut<V>,
1905 G: Fn(Root) -> Option<Value>,
1906 S: Fn(MutRoot) -> Option<MutValue>,
1907{
1908 #[inline]
1910 fn get_optional(&self, root: Option<Root>) -> Option<Value> {
1911 root.and_then(|r| (self.get)(r))
1912 }
1913
1914 #[inline]
1916 fn get_mut_optional(&self, root: Option<MutRoot>) -> Option<MutValue> {
1917 root.and_then(|r| (self.set)(r))
1918 }
1919
1920 #[inline]
1922 fn get_or_else<F>(&self, root: Root, f: F) -> Value
1923 where
1924 F: FnOnce() -> Value,
1925 {
1926 (self.get)(root).unwrap_or_else(f)
1927 }
1928
1929 #[inline]
1931 fn get_mut_or_else<F>(&self, root: MutRoot, f: F) -> MutValue
1932 where
1933 F: FnOnce() -> MutValue,
1934 {
1935 (self.set)(root).unwrap_or_else(f)
1936 }
1937}
1938
1939#[derive(Clone)]
1951pub struct Kp<R, V, Root, Value, MutRoot, MutValue, G, S>
1952where
1953 Root: std::borrow::Borrow<R>,
1954 MutRoot: std::borrow::BorrowMut<R>,
1955 MutValue: std::borrow::BorrowMut<V>,
1956 G: Fn(Root) -> Option<Value>,
1957 S: Fn(MutRoot) -> Option<MutValue>,
1958{
1959 pub get: G,
1961 pub set: S,
1963 _p: std::marker::PhantomData<(R, V, Root, Value, MutRoot, MutValue)>,
1964}
1965
1966unsafe impl<R, V, Root, Value, MutRoot, MutValue, G, S> Send
1968 for Kp<R, V, Root, Value, MutRoot, MutValue, G, S>
1969where
1970 Root: std::borrow::Borrow<R>,
1971 MutRoot: std::borrow::BorrowMut<R>,
1972 MutValue: std::borrow::BorrowMut<V>,
1973 G: Fn(Root) -> Option<Value> + Send,
1974 S: Fn(MutRoot) -> Option<MutValue> + Send,
1975{
1976}
1977unsafe impl<R, V, Root, Value, MutRoot, MutValue, G, S> Sync
1978 for Kp<R, V, Root, Value, MutRoot, MutValue, G, S>
1979where
1980 Root: std::borrow::Borrow<R>,
1981 MutRoot: std::borrow::BorrowMut<R>,
1982 MutValue: std::borrow::BorrowMut<V>,
1983 G: Fn(Root) -> Option<Value> + Sync,
1984 S: Fn(MutRoot) -> Option<MutValue> + Sync,
1985{
1986}
1987
1988impl<R, V, Root, Value, MutRoot, MutValue, G, S> Kp<R, V, Root, Value, MutRoot, MutValue, G, S>
1989where
1990 Root: std::borrow::Borrow<R>,
1991 Value: std::borrow::Borrow<V>,
1992 MutRoot: std::borrow::BorrowMut<R>,
1993 MutValue: std::borrow::BorrowMut<V>,
1994 G: Fn(Root) -> Option<Value>,
1995 S: Fn(MutRoot) -> Option<MutValue>,
1996{
1997 pub fn new(get: G, set: S) -> Self {
1998 Self {
1999 get: get,
2000 set: set,
2001 _p: std::marker::PhantomData,
2002 }
2003 }
2004
2005 #[inline]
2016 pub fn then<SV, SubValue, MutSubValue, G2, S2>(
2017 self,
2018 next: Kp<V, SV, Value, SubValue, MutValue, MutSubValue, G2, S2>,
2019 ) -> Kp<
2020 R,
2021 SV,
2022 Root,
2023 SubValue,
2024 MutRoot,
2025 MutSubValue,
2026 impl Fn(Root) -> Option<SubValue>,
2027 impl Fn(MutRoot) -> Option<MutSubValue>,
2028 >
2029 where
2030 SubValue: std::borrow::Borrow<SV>,
2031 MutSubValue: std::borrow::BorrowMut<SV>,
2032 G2: Fn(Value) -> Option<SubValue>,
2033 S2: Fn(MutValue) -> Option<MutSubValue>,
2034 {
2035
2036 Kp::new(
2037 move |root: Root| (self.get)(root).and_then(|value| (next.get)(value)),
2038 move |root: MutRoot| (self.set)(root).and_then(|value| (next.set)(value)),
2039 )
2040 }
2041}
2042
2043impl<R, V, Root, Value, MutRoot, MutValue, G, S> fmt::Debug
2044 for Kp<R, V, Root, Value, MutRoot, MutValue, G, S>
2045where
2046 Root: std::borrow::Borrow<R>,
2047 Value: std::borrow::Borrow<V>,
2048 MutRoot: std::borrow::BorrowMut<R>,
2049 MutValue: std::borrow::BorrowMut<V>,
2050 G: Fn(Root) -> Option<Value>,
2051 S: Fn(MutRoot) -> Option<MutValue>,
2052{
2053 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2054 f.debug_struct("Kp")
2055 .field("root_ty", &std::any::type_name::<R>())
2056 .field("value_ty", &std::any::type_name::<V>())
2057 .finish_non_exhaustive()
2058 }
2059}
2060
2061impl<R, V, Root, Value, MutRoot, MutValue, G, S> fmt::Display
2062 for Kp<R, V, Root, Value, MutRoot, MutValue, G, S>
2063where
2064 Root: std::borrow::Borrow<R>,
2065 Value: std::borrow::Borrow<V>,
2066 MutRoot: std::borrow::BorrowMut<R>,
2067 MutValue: std::borrow::BorrowMut<V>,
2068 G: Fn(Root) -> Option<Value>,
2069 S: Fn(MutRoot) -> Option<MutValue>,
2070{
2071 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2072 write!(
2073 f,
2074 "Kp<{}, {}>",
2075 std::any::type_name::<R>(),
2076 std::any::type_name::<V>()
2077 )
2078 }
2079}
2080
2081pub fn zip_kps<'a, RootType, Value1, Value2>(
2095 kp1: &'a KpType<'a, RootType, Value1>,
2096 kp2: &'a KpType<'a, RootType, Value2>,
2097) -> impl Fn(&'a RootType) -> Option<(&'a Value1, &'a Value2)> + 'a
2098where
2099 RootType: 'a,
2100 Value1: 'a,
2101 Value2: 'a,
2102{
2103 move |root: &'a RootType| {
2104 let val1 = (kp1.get)(root)?;
2105 let val2 = (kp2.get)(root)?;
2106 Some((val1, val2))
2107 }
2108}
2109
2110impl<R, Root, MutRoot, G, S> Kp<R, R, Root, Root, MutRoot, MutRoot, G, S>
2111where
2112 Root: std::borrow::Borrow<R>,
2113 MutRoot: std::borrow::BorrowMut<R>,
2114 G: Fn(Root) -> Option<Root>,
2115 S: Fn(MutRoot) -> Option<MutRoot>,
2116{
2117 pub fn identity_typed() -> Kp<
2118 R,
2119 R,
2120 Root,
2121 Root,
2122 MutRoot,
2123 MutRoot,
2124 fn(Root) -> Option<Root>,
2125 fn(MutRoot) -> Option<MutRoot>,
2126 > {
2127 Kp::new(|r: Root| Some(r), |r: MutRoot| Some(r))
2128 }
2129
2130 pub fn identity<'a>() -> KpType<'a, R, R> {
2131 KpType::new(|r| Some(r), |r| Some(r))
2132 }
2133}
2134
2135pub struct EnumKp<Enum, Variant, Root, Value, MutRoot, MutValue, G, S, E>
2144where
2145 Root: std::borrow::Borrow<Enum>,
2146 Value: std::borrow::Borrow<Variant>,
2147 MutRoot: std::borrow::BorrowMut<Enum>,
2148 MutValue: std::borrow::BorrowMut<Variant>,
2149 G: Fn(Root) -> Option<Value>,
2150 S: Fn(MutRoot) -> Option<MutValue>,
2151 E: Fn(Variant) -> Enum,
2152{
2153 extractor: Kp<Enum, Variant, Root, Value, MutRoot, MutValue, G, S>,
2154 embedder: E,
2155}
2156
2157unsafe impl<Enum, Variant, Root, Value, MutRoot, MutValue, G, S, E> Send
2159 for EnumKp<Enum, Variant, Root, Value, MutRoot, MutValue, G, S, E>
2160where
2161 Root: std::borrow::Borrow<Enum>,
2162 Value: std::borrow::Borrow<Variant>,
2163 MutRoot: std::borrow::BorrowMut<Enum>,
2164 MutValue: std::borrow::BorrowMut<Variant>,
2165 G: Fn(Root) -> Option<Value> + Send,
2166 S: Fn(MutRoot) -> Option<MutValue> + Send,
2167 E: Fn(Variant) -> Enum + Send,
2168{
2169}
2170unsafe impl<Enum, Variant, Root, Value, MutRoot, MutValue, G, S, E> Sync
2171 for EnumKp<Enum, Variant, Root, Value, MutRoot, MutValue, G, S, E>
2172where
2173 Root: std::borrow::Borrow<Enum>,
2174 Value: std::borrow::Borrow<Variant>,
2175 MutRoot: std::borrow::BorrowMut<Enum>,
2176 MutValue: std::borrow::BorrowMut<Variant>,
2177 G: Fn(Root) -> Option<Value> + Sync,
2178 S: Fn(MutRoot) -> Option<MutValue> + Sync,
2179 E: Fn(Variant) -> Enum + Sync,
2180{
2181}
2182
2183impl<Enum, Variant, Root, Value, MutRoot, MutValue, G, S, E>
2184 EnumKp<Enum, Variant, Root, Value, MutRoot, MutValue, G, S, E>
2185where
2186 Root: std::borrow::Borrow<Enum>,
2187 Value: std::borrow::Borrow<Variant>,
2188 MutRoot: std::borrow::BorrowMut<Enum>,
2189 MutValue: std::borrow::BorrowMut<Variant>,
2190 G: Fn(Root) -> Option<Value>,
2191 S: Fn(MutRoot) -> Option<MutValue>,
2192 E: Fn(Variant) -> Enum,
2193{
2194 pub fn new(
2196 extractor: Kp<Enum, Variant, Root, Value, MutRoot, MutValue, G, S>,
2197 embedder: E,
2198 ) -> Self {
2199 Self {
2200 extractor,
2201 embedder,
2202 }
2203 }
2204
2205 pub fn get(&self, enum_value: Root) -> Option<Value> {
2207 (self.extractor.get)(enum_value)
2208 }
2209
2210 pub fn get_mut(&self, enum_value: MutRoot) -> Option<MutValue> {
2212 (self.extractor.set)(enum_value)
2213 }
2214
2215 pub fn embed(&self, value: Variant) -> Enum {
2217 (self.embedder)(value)
2218 }
2219
2220 pub fn as_kp(&self) -> &Kp<Enum, Variant, Root, Value, MutRoot, MutValue, G, S> {
2222 &self.extractor
2223 }
2224
2225 pub fn into_kp(self) -> Kp<Enum, Variant, Root, Value, MutRoot, MutValue, G, S> {
2227 self.extractor
2228 }
2229
2230 pub fn map<MappedValue, F>(
2241 &self,
2242 mapper: F,
2243 ) -> EnumKp<
2244 Enum,
2245 MappedValue,
2246 Root,
2247 MappedValue,
2248 MutRoot,
2249 MappedValue,
2250 impl Fn(Root) -> Option<MappedValue>,
2251 impl Fn(MutRoot) -> Option<MappedValue>,
2252 impl Fn(MappedValue) -> Enum,
2253 >
2254 where
2255 F: Fn(&Variant) -> MappedValue + Copy + 'static,
2258 Variant: 'static,
2259 MappedValue: 'static,
2260 E: Fn(Variant) -> Enum + Copy + 'static,
2262 {
2263 let mapped_extractor = self.extractor.map(mapper);
2264
2265 let new_embedder = move |_value: MappedValue| -> Enum {
2269 panic!(
2270 "Cannot embed mapped values back into enum. Use the original EnumKp for embedding."
2271 )
2272 };
2273
2274 EnumKp::new(mapped_extractor, new_embedder)
2275 }
2276
2277 pub fn filter<F>(
2289 &self,
2290 predicate: F,
2291 ) -> EnumKp<
2292 Enum,
2293 Variant,
2294 Root,
2295 Value,
2296 MutRoot,
2297 MutValue,
2298 impl Fn(Root) -> Option<Value>,
2299 impl Fn(MutRoot) -> Option<MutValue>,
2300 E,
2301 >
2302 where
2303 F: Fn(&Variant) -> bool + Copy + 'static,
2306 Variant: 'static,
2307 E: Copy,
2309 {
2310 let filtered_extractor = self.extractor.filter(predicate);
2311 EnumKp::new(filtered_extractor, self.embedder)
2312 }
2313}
2314
2315impl<Enum, Variant, Root, Value, MutRoot, MutValue, G, S, E> fmt::Debug
2316 for EnumKp<Enum, Variant, Root, Value, MutRoot, MutValue, G, S, E>
2317where
2318 Root: std::borrow::Borrow<Enum>,
2319 Value: std::borrow::Borrow<Variant>,
2320 MutRoot: std::borrow::BorrowMut<Enum>,
2321 MutValue: std::borrow::BorrowMut<Variant>,
2322 G: Fn(Root) -> Option<Value>,
2323 S: Fn(MutRoot) -> Option<MutValue>,
2324 E: Fn(Variant) -> Enum,
2325{
2326 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2327 f.debug_struct("EnumKp")
2328 .field("enum_ty", &std::any::type_name::<Enum>())
2329 .field("variant_ty", &std::any::type_name::<Variant>())
2330 .finish_non_exhaustive()
2331 }
2332}
2333
2334impl<Enum, Variant, Root, Value, MutRoot, MutValue, G, S, E> fmt::Display
2335 for EnumKp<Enum, Variant, Root, Value, MutRoot, MutValue, G, S, E>
2336where
2337 Root: std::borrow::Borrow<Enum>,
2338 Value: std::borrow::Borrow<Variant>,
2339 MutRoot: std::borrow::BorrowMut<Enum>,
2340 MutValue: std::borrow::BorrowMut<Variant>,
2341 G: Fn(Root) -> Option<Value>,
2342 S: Fn(MutRoot) -> Option<MutValue>,
2343 E: Fn(Variant) -> Enum,
2344{
2345 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2346 write!(
2347 f,
2348 "EnumKp<{}, {}>",
2349 std::any::type_name::<Enum>(),
2350 std::any::type_name::<Variant>()
2351 )
2352 }
2353}
2354
2355pub type EnumKpType<'a, Enum, Variant> = EnumKp<
2357 Enum,
2358 Variant,
2359 &'a Enum,
2360 &'a Variant,
2361 &'a mut Enum,
2362 &'a mut Variant,
2363 for<'b> fn(&'b Enum) -> Option<&'b Variant>,
2364 for<'b> fn(&'b mut Enum) -> Option<&'b mut Variant>,
2365 fn(Variant) -> Enum,
2366>;
2367
2368pub fn enum_variant<'a, Enum, Variant>(
2386 getter: for<'b> fn(&'b Enum) -> Option<&'b Variant>,
2387 setter: for<'b> fn(&'b mut Enum) -> Option<&'b mut Variant>,
2388 embedder: fn(Variant) -> Enum,
2389) -> EnumKpType<'a, Enum, Variant> {
2390 EnumKp::new(Kp::new(getter, setter), embedder)
2391}
2392
2393pub fn enum_ok<'a, T, E>() -> EnumKpType<'a, Result<T, E>, T> {
2403 EnumKp::new(
2404 Kp::new(
2405 |r: &Result<T, E>| r.as_ref().ok(),
2406 |r: &mut Result<T, E>| r.as_mut().ok(),
2407 ),
2408 |t: T| Ok(t),
2409 )
2410}
2411
2412pub fn enum_err<'a, T, E>() -> EnumKpType<'a, Result<T, E>, E> {
2422 EnumKp::new(
2423 Kp::new(
2424 |r: &Result<T, E>| r.as_ref().err(),
2425 |r: &mut Result<T, E>| r.as_mut().err(),
2426 ),
2427 |e: E| Err(e),
2428 )
2429}
2430
2431pub fn enum_some<'a, T>() -> EnumKpType<'a, Option<T>, T> {
2441 EnumKp::new(
2442 Kp::new(|o: &Option<T>| o.as_ref(), |o: &mut Option<T>| o.as_mut()),
2443 |t: T| Some(t),
2444 )
2445}
2446
2447pub fn variant_of<'a, Enum, Variant>(
2465 getter: for<'b> fn(&'b Enum) -> Option<&'b Variant>,
2466 setter: for<'b> fn(&'b mut Enum) -> Option<&'b mut Variant>,
2467 embedder: fn(Variant) -> Enum,
2468) -> EnumKpType<'a, Enum, Variant> {
2469 enum_variant(getter, setter, embedder)
2470}
2471
2472pub fn kp_box<'a, T>() -> KpType<'a, Box<T>, T> {
2485 Kp::new(
2486 |b: &Box<T>| Some(b.as_ref()),
2487 |b: &mut Box<T>| Some(b.as_mut()),
2488 )
2489}
2490
2491pub fn kp_arc<'a, T>() -> Kp<
2502 Arc<T>,
2503 T,
2504 &'a Arc<T>,
2505 &'a T,
2506 &'a mut Arc<T>,
2507 &'a mut T,
2508 for<'b> fn(&'b Arc<T>) -> Option<&'b T>,
2509 for<'b> fn(&'b mut Arc<T>) -> Option<&'b mut T>,
2510> {
2511 Kp::new(
2512 |arc: &Arc<T>| Some(arc.as_ref()),
2513 |arc: &mut Arc<T>| Arc::get_mut(arc),
2514 )
2515}
2516
2517pub fn kp_rc<'a, T>() -> Kp<
2528 std::rc::Rc<T>,
2529 T,
2530 &'a std::rc::Rc<T>,
2531 &'a T,
2532 &'a mut std::rc::Rc<T>,
2533 &'a mut T,
2534 for<'b> fn(&'b std::rc::Rc<T>) -> Option<&'b T>,
2535 for<'b> fn(&'b mut std::rc::Rc<T>) -> Option<&'b mut T>,
2536> {
2537 Kp::new(
2538 |rc: &std::rc::Rc<T>| Some(rc.as_ref()),
2539 |rc: &mut std::rc::Rc<T>| std::rc::Rc::get_mut(rc),
2540 )
2541}
2542
2543use std::any::{Any, TypeId};
2546use std::rc::Rc;
2547
2548#[cfg(test)]
2563mod tests {
2564 use super::*;
2565 use std::collections::HashMap;
2566
2567 fn kp_adaptable<T, Root, Value, MutRoot, MutValue, G, S>(kp: T)
2568 where
2569 T: KpTrait<TestKP, String, Root, Value, MutRoot, MutValue, G, S>,
2570 {
2571 }
2574 fn test_kp_trait() {}
2575
2576 #[derive(Debug)]
2577 struct TestKP {
2578 a: String,
2579 b: String,
2580 c: std::sync::Arc<String>,
2581 d: std::sync::Mutex<String>,
2582 e: std::sync::Arc<std::sync::Mutex<TestKP2>>,
2583 f: Option<TestKP2>,
2584 g: HashMap<i32, TestKP2>,
2585 }
2586
2587 impl TestKP {
2588 fn new() -> Self {
2589 Self {
2590 a: String::from("a"),
2591 b: String::from("b"),
2592 c: std::sync::Arc::new(String::from("c")),
2593 d: std::sync::Mutex::new(String::from("d")),
2594 e: std::sync::Arc::new(std::sync::Mutex::new(TestKP2::new())),
2595 f: Some(TestKP2 {
2596 a: String::from("a3"),
2597 b: std::sync::Arc::new(std::sync::Mutex::new(TestKP3::new())),
2598 }),
2599 g: HashMap::new(),
2600 }
2601 }
2602
2603 fn g(index: i32) -> KpComposed<TestKP, TestKP2> {
2604 KpComposed::from_closures(
2605 move |r: &TestKP| r.g.get(&index),
2606 move |r: &mut TestKP| r.g.get_mut(&index),
2607 )
2608 }
2609
2610 fn a_typed<Root, MutRoot, Value, MutValue>() -> Kp<
2613 TestKP2,
2614 String,
2615 Root,
2616 Value,
2617 MutRoot,
2618 MutValue,
2619 impl Fn(Root) -> Option<Value>,
2620 impl Fn(MutRoot) -> Option<MutValue>,
2621 >
2622 where
2623 Root: std::borrow::Borrow<TestKP2>,
2624 MutRoot: std::borrow::BorrowMut<TestKP2>,
2625 Value: std::borrow::Borrow<String> + From<String>,
2626 MutValue: std::borrow::BorrowMut<String> + From<String>,
2627 {
2628 Kp::new(
2629 |r: Root| Some(Value::from(r.borrow().a.clone())),
2630 |mut r: MutRoot| Some(MutValue::from(r.borrow_mut().a.clone())),
2631 )
2632 }
2633
2634 fn c<'a>() -> KpType<'a, TestKP, String> {
2637 KpType::new(
2638 |r: &TestKP| Some(r.c.as_ref()),
2639 |r: &mut TestKP| match std::sync::Arc::get_mut(&mut r.c) {
2640 Some(arc_str) => Some(arc_str),
2641 None => None,
2642 },
2643 )
2644 }
2645
2646 fn a<'a>() -> KpType<'a, TestKP, String> {
2647 KpType::new(|r: &TestKP| Some(&r.a), |r: &mut TestKP| Some(&mut r.a))
2648 }
2649
2650 fn f<'a>() -> KpType<'a, TestKP, TestKP2> {
2651 KpType::new(|r: &TestKP| r.f.as_ref(), |r: &mut TestKP| r.f.as_mut())
2652 }
2653
2654 fn identity<'a>() -> KpType<'a, TestKP, TestKP> {
2655 KpType::identity()
2656 }
2657 }
2658
2659 #[test]
2660 fn kp_debug_display_uses_type_names() {
2661 let kp = TestKP::a();
2662 let dbg = format!("{kp:?}");
2663 assert!(dbg.starts_with("Kp {"), "{dbg}");
2664 assert!(dbg.contains("root_ty") && dbg.contains("value_ty"), "{dbg}");
2665 let disp = format!("{kp}");
2666 assert!(disp.contains("TestKP"), "{disp}");
2667 assert!(disp.contains("String"), "{disp}");
2668 }
2669
2670 #[test]
2671 fn akp_and_pkp_debug_display() {
2672 let akp = AKp::new(TestKP::a());
2673 assert!(format!("{akp:?}").starts_with("AKp"));
2674 let pkp = PKp::new(TestKP::a());
2675 let pkp_dbg = format!("{pkp:?}");
2676 assert!(pkp_dbg.starts_with("PKp"), "{pkp_dbg}");
2677 assert!(format!("{pkp}").contains("TestKP"));
2678 }
2679
2680 #[test]
2681 fn enum_kp_debug_display() {
2682 let ok_kp = enum_ok::<i32, String>();
2683 assert!(format!("{ok_kp:?}").contains("EnumKp"));
2684 let s = format!("{ok_kp}");
2685 assert!(s.contains("Result") && s.contains("i32"), "{s}");
2686 }
2687
2688 #[derive(Debug)]
2689 struct TestKP2 {
2690 a: String,
2691 b: std::sync::Arc<std::sync::Mutex<TestKP3>>,
2692 }
2693
2694 impl TestKP2 {
2695 fn new() -> Self {
2696 TestKP2 {
2697 a: String::from("a2"),
2698 b: std::sync::Arc::new(std::sync::Mutex::new(TestKP3::new())),
2699 }
2700 }
2701
2702 fn identity_typed<Root, MutRoot, G, S>() -> Kp<
2703 TestKP2, TestKP2, Root, Root, MutRoot, MutRoot, fn(Root) -> Option<Root>,
2710 fn(MutRoot) -> Option<MutRoot>,
2711 >
2712 where
2713 Root: std::borrow::Borrow<TestKP2>,
2714 MutRoot: std::borrow::BorrowMut<TestKP2>,
2715 G: Fn(Root) -> Option<Root>,
2716 S: Fn(MutRoot) -> Option<MutRoot>,
2717 {
2718 Kp::<TestKP2, TestKP2, Root, Root, MutRoot, MutRoot, G, S>::identity_typed()
2719 }
2720
2721 fn a<'a>() -> KpType<'a, TestKP2, String> {
2722 KpType::new(|r: &TestKP2| Some(&r.a), |r: &mut TestKP2| Some(&mut r.a))
2723 }
2724
2725 fn b<'a>() -> KpType<'a, TestKP2, std::sync::Arc<std::sync::Mutex<TestKP3>>> {
2726 KpType::new(|r: &TestKP2| Some(&r.b), |r: &mut TestKP2| Some(&mut r.b))
2727 }
2728
2729 fn identity<'a>() -> KpType<'a, TestKP2, TestKP2> {
2734 KpType::identity()
2735 }
2736 }
2737
2738 #[derive(Debug)]
2739 struct TestKP3 {
2740 a: String,
2741 b: std::sync::Arc<std::sync::Mutex<String>>,
2742 }
2743
2744 impl TestKP3 {
2745 fn new() -> Self {
2746 TestKP3 {
2747 a: String::from("a2"),
2748 b: std::sync::Arc::new(std::sync::Mutex::new(String::from("b2"))),
2749 }
2750 }
2751
2752 fn identity_typed<Root, MutRoot, G, S>() -> Kp<
2753 TestKP3, TestKP3, Root, Root, MutRoot, MutRoot, fn(Root) -> Option<Root>,
2760 fn(MutRoot) -> Option<MutRoot>,
2761 >
2762 where
2763 Root: std::borrow::Borrow<TestKP3>,
2764 MutRoot: std::borrow::BorrowMut<TestKP3>,
2765 G: Fn(Root) -> Option<Root>,
2766 S: Fn(MutRoot) -> Option<MutRoot>,
2767 {
2768 Kp::<TestKP3, TestKP3, Root, Root, MutRoot, MutRoot, G, S>::identity_typed()
2769 }
2770
2771 fn identity<'a>() -> KpType<'a, TestKP3, TestKP3> {
2772 KpType::identity()
2773 }
2774 }
2775
2776 impl TestKP3 {}
2777
2778 impl TestKP {}
2779 #[test]
2780 fn test_a() {
2781 let instance2 = TestKP2::new();
2782 let mut instance = TestKP::new();
2783 let kp = TestKP::identity();
2784 let kp_a = TestKP::a();
2785 let wres = TestKP::f()
2787 .then(TestKP2::a())
2788 .get_mut(&mut instance)
2789 .unwrap();
2790 *wres = String::from("a3 changed successfully");
2791 let res = (TestKP::f().then(TestKP2::a()).get)(&instance);
2792 println!("{:?}", res);
2793 let res = (TestKP::f().then(TestKP2::identity()).get)(&instance);
2794 println!("{:?}", res);
2795 let res = (kp.get)(&instance);
2796 println!("{:?}", res);
2797
2798 let new_kp_from_hashmap = TestKP::g(0).then(TestKP2::a());
2799 println!("{:?}", (new_kp_from_hashmap.get)(&instance));
2800 }
2801
2802 #[test]
2881 fn test_enum_kp_result_ok() {
2882 let ok_result: Result<String, i32> = Ok("success".to_string());
2883 let mut err_result: Result<String, i32> = Err(42);
2884
2885 let ok_kp = enum_ok();
2886
2887 assert_eq!(ok_kp.get(&ok_result), Some(&"success".to_string()));
2889 assert_eq!(ok_kp.get(&err_result), None);
2890
2891 let embedded = ok_kp.embed("embedded".to_string());
2893 assert_eq!(embedded, Ok("embedded".to_string()));
2894
2895 if let Some(val) = ok_kp.get_mut(&mut err_result) {
2897 *val = "modified".to_string();
2898 }
2899 assert_eq!(err_result, Err(42)); let mut ok_result2 = Ok("original".to_string());
2902 if let Some(val) = ok_kp.get_mut(&mut ok_result2) {
2903 *val = "modified".to_string();
2904 }
2905 assert_eq!(ok_result2, Ok("modified".to_string()));
2906 }
2907
2908 #[test]
2909 fn test_enum_kp_result_err() {
2910 let ok_result: Result<String, i32> = Ok("success".to_string());
2911 let mut err_result: Result<String, i32> = Err(42);
2912
2913 let err_kp = enum_err();
2914
2915 assert_eq!(err_kp.get(&err_result), Some(&42));
2917 assert_eq!(err_kp.get(&ok_result), None);
2918
2919 let embedded = err_kp.embed(99);
2921 assert_eq!(embedded, Err(99));
2922
2923 if let Some(val) = err_kp.get_mut(&mut err_result) {
2925 *val = 100;
2926 }
2927 assert_eq!(err_result, Err(100));
2928 }
2929
2930 #[test]
2931 fn test_enum_kp_option_some() {
2932 let some_opt = Some("value".to_string());
2933 let mut none_opt: Option<String> = None;
2934
2935 let some_kp = enum_some();
2936
2937 assert_eq!(some_kp.get(&some_opt), Some(&"value".to_string()));
2939 assert_eq!(some_kp.get(&none_opt), None);
2940
2941 let embedded = some_kp.embed("embedded".to_string());
2943 assert_eq!(embedded, Some("embedded".to_string()));
2944
2945 let mut some_opt2 = Some("original".to_string());
2947 if let Some(val) = some_kp.get_mut(&mut some_opt2) {
2948 *val = "modified".to_string();
2949 }
2950 assert_eq!(some_opt2, Some("modified".to_string()));
2951 }
2952
2953 #[test]
2954 fn test_enum_kp_custom_enum() {
2955 #[derive(Debug, PartialEq)]
2956 enum MyEnum {
2957 A(String),
2958 B(i32),
2959 C,
2960 }
2961
2962 let mut enum_a = MyEnum::A("hello".to_string());
2963 let enum_b = MyEnum::B(42);
2964 let enum_c = MyEnum::C;
2965
2966 let kp_a = enum_variant(
2968 |e: &MyEnum| match e {
2969 MyEnum::A(s) => Some(s),
2970 _ => None,
2971 },
2972 |e: &mut MyEnum| match e {
2973 MyEnum::A(s) => Some(s),
2974 _ => None,
2975 },
2976 |s: String| MyEnum::A(s),
2977 );
2978
2979 assert_eq!(kp_a.get(&enum_a), Some(&"hello".to_string()));
2981 assert_eq!(kp_a.get(&enum_b), None);
2982 assert_eq!(kp_a.get(&enum_c), None);
2983
2984 let embedded = kp_a.embed("world".to_string());
2986 assert_eq!(embedded, MyEnum::A("world".to_string()));
2987
2988 if let Some(val) = kp_a.get_mut(&mut enum_a) {
2990 *val = "modified".to_string();
2991 }
2992 assert_eq!(enum_a, MyEnum::A("modified".to_string()));
2993 }
2994
2995 #[test]
2996 fn test_container_kp_box() {
2997 let boxed = Box::new("value".to_string());
2998 let mut boxed_mut = Box::new("original".to_string());
2999
3000 let box_kp = kp_box();
3001
3002 assert_eq!((box_kp.get)(&boxed), Some(&"value".to_string()));
3004
3005 if let Some(val) = box_kp.get_mut(&mut boxed_mut) {
3007 *val = "modified".to_string();
3008 }
3009 assert_eq!(*boxed_mut, "modified".to_string());
3010 }
3011
3012 #[test]
3013 fn test_container_kp_arc() {
3014 let arc = Arc::new("value".to_string());
3015 let mut arc_mut = Arc::new("original".to_string());
3016
3017 let arc_kp = kp_arc();
3018
3019 assert_eq!((arc_kp.get)(&arc), Some(&"value".to_string()));
3021
3022 if let Some(val) = arc_kp.get_mut(&mut arc_mut) {
3024 *val = "modified".to_string();
3025 }
3026 assert_eq!(*arc_mut, "modified".to_string());
3027
3028 let arc_shared = Arc::new("shared".to_string());
3030 let arc_shared2 = Arc::clone(&arc_shared);
3031 let mut arc_shared_mut = arc_shared;
3032 assert_eq!(arc_kp.get_mut(&mut arc_shared_mut), None);
3033 }
3034
3035 #[test]
3036 fn test_enum_kp_composition() {
3037 #[derive(Debug, PartialEq)]
3039 struct Inner {
3040 value: String,
3041 }
3042
3043 let result: Result<Inner, i32> = Ok(Inner {
3044 value: "nested".to_string(),
3045 });
3046
3047 let inner_kp = KpType::new(
3049 |i: &Inner| Some(&i.value),
3050 |i: &mut Inner| Some(&mut i.value),
3051 );
3052
3053 let ok_kp = enum_ok::<Inner, i32>();
3055 let ok_kp_base = ok_kp.into_kp();
3056 let composed = ok_kp_base.then(inner_kp);
3057
3058 assert_eq!((composed.get)(&result), Some(&"nested".to_string()));
3059 }
3060
3061 #[test]
3062 fn test_pkp_basic() {
3063 #[derive(Debug)]
3064 struct User {
3065 name: String,
3066 age: i32,
3067 }
3068
3069 let user = User {
3070 name: "Akash".to_string(),
3071 age: 30,
3072 };
3073
3074 let name_kp = KpType::new(|u: &User| Some(&u.name), |u: &mut User| Some(&mut u.name));
3076 let age_kp = KpType::new(|u: &User| Some(&u.age), |u: &mut User| Some(&mut u.age));
3077
3078 let name_pkp = PKp::new(name_kp);
3080 let age_pkp = PKp::new(age_kp);
3081
3082 assert_eq!(name_pkp.get_as::<String>(&user), Some(&"Akash".to_string()));
3084 assert_eq!(age_pkp.get_as::<i32>(&user), Some(&30));
3085
3086 assert_eq!(name_pkp.get_as::<i32>(&user), None);
3088 assert_eq!(age_pkp.get_as::<String>(&user), None);
3089
3090 assert_eq!(name_pkp.value_type_id(), TypeId::of::<String>());
3092 assert_eq!(age_pkp.value_type_id(), TypeId::of::<i32>());
3093 }
3094
3095 #[test]
3096 fn test_pkp_collection() {
3097 #[derive(Debug)]
3098 struct User {
3099 name: String,
3100 age: i32,
3101 }
3102
3103 let user = User {
3104 name: "Bob".to_string(),
3105 age: 25,
3106 };
3107
3108 let name_kp = KpType::new(|u: &User| Some(&u.name), |u: &mut User| Some(&mut u.name));
3110 let age_kp = KpType::new(|u: &User| Some(&u.age), |u: &mut User| Some(&mut u.age));
3111
3112 let keypaths: Vec<PKp<User>> = vec![PKp::new(name_kp), PKp::new(age_kp)];
3113
3114 let name_value = keypaths[0].get_as::<String>(&user);
3116 let age_value = keypaths[1].get_as::<i32>(&user);
3117
3118 assert_eq!(name_value, Some(&"Bob".to_string()));
3119 assert_eq!(age_value, Some(&25));
3120 }
3121
3122 #[test]
3123 fn test_pkp_for_arc() {
3124 #[derive(Debug)]
3125 struct User {
3126 name: String,
3127 }
3128
3129 let user = Arc::new(User {
3130 name: "Charlie".to_string(),
3131 });
3132
3133 let name_kp = KpType::new(|u: &User| Some(&u.name), |u: &mut User| Some(&mut u.name));
3134 let name_pkp = PKp::new(name_kp);
3135
3136 let arc_pkp = name_pkp.for_arc();
3138
3139 assert_eq!(
3140 arc_pkp.get_as::<String>(&user),
3141 Some(&"Charlie".to_string())
3142 );
3143 }
3144
3145 #[test]
3146 fn test_pkp_for_option() {
3147 #[derive(Debug)]
3148 struct User {
3149 name: String,
3150 }
3151
3152 let some_user = Some(User {
3153 name: "Diana".to_string(),
3154 });
3155 let none_user: Option<User> = None;
3156
3157 let name_kp = KpType::new(|u: &User| Some(&u.name), |u: &mut User| Some(&mut u.name));
3158 let name_pkp = PKp::new(name_kp);
3159
3160 let opt_pkp = name_pkp.for_option();
3162
3163 assert_eq!(
3164 opt_pkp.get_as::<String>(&some_user),
3165 Some(&"Diana".to_string())
3166 );
3167 assert_eq!(opt_pkp.get_as::<String>(&none_user), None);
3168 }
3169
3170 #[test]
3171 fn test_akp_basic() {
3172 #[derive(Debug)]
3173 struct User {
3174 name: String,
3175 age: i32,
3176 }
3177
3178 #[derive(Debug)]
3179 struct Product {
3180 title: String,
3181 price: f64,
3182 }
3183
3184 let user = User {
3185 name: "Eve".to_string(),
3186 age: 28,
3187 };
3188
3189 let product = Product {
3190 title: "Book".to_string(),
3191 price: 19.99,
3192 };
3193
3194 let user_name_kp = KpType::new(|u: &User| Some(&u.name), |u: &mut User| Some(&mut u.name));
3196 let user_name_akp = AKp::new(user_name_kp);
3197
3198 let product_title_kp = KpType::new(
3199 |p: &Product| Some(&p.title),
3200 |p: &mut Product| Some(&mut p.title),
3201 );
3202 let product_title_akp = AKp::new(product_title_kp);
3203
3204 assert_eq!(
3206 user_name_akp.get_as::<User, String>(&user),
3207 Some(Some(&"Eve".to_string()))
3208 );
3209 assert_eq!(
3210 product_title_akp.get_as::<Product, String>(&product),
3211 Some(Some(&"Book".to_string()))
3212 );
3213
3214 assert_eq!(user_name_akp.get_as::<Product, String>(&product), None);
3216 assert_eq!(product_title_akp.get_as::<User, String>(&user), None);
3217
3218 assert_eq!(user_name_akp.root_type_id(), TypeId::of::<User>());
3220 assert_eq!(user_name_akp.value_type_id(), TypeId::of::<String>());
3221 assert_eq!(product_title_akp.root_type_id(), TypeId::of::<Product>());
3222 assert_eq!(product_title_akp.value_type_id(), TypeId::of::<String>());
3223 }
3224
3225 #[test]
3226 fn test_akp_heterogeneous_collection() {
3227 #[derive(Debug)]
3228 struct User {
3229 name: String,
3230 }
3231
3232 #[derive(Debug)]
3233 struct Product {
3234 title: String,
3235 }
3236
3237 let user = User {
3238 name: "Frank".to_string(),
3239 };
3240 let product = Product {
3241 title: "Laptop".to_string(),
3242 };
3243
3244 let user_name_kp = KpType::new(|u: &User| Some(&u.name), |u: &mut User| Some(&mut u.name));
3246 let product_title_kp = KpType::new(
3247 |p: &Product| Some(&p.title),
3248 |p: &mut Product| Some(&mut p.title),
3249 );
3250
3251 let keypaths: Vec<AKp> = vec![AKp::new(user_name_kp), AKp::new(product_title_kp)];
3252
3253 let user_any: &dyn Any = &user;
3255 let product_any: &dyn Any = &product;
3256
3257 let user_value = keypaths[0].get(user_any);
3258 let product_value = keypaths[1].get(product_any);
3259
3260 assert!(user_value.is_some());
3261 assert!(product_value.is_some());
3262
3263 assert_eq!(
3265 user_value.and_then(|v| v.downcast_ref::<String>()),
3266 Some(&"Frank".to_string())
3267 );
3268 assert_eq!(
3269 product_value.and_then(|v| v.downcast_ref::<String>()),
3270 Some(&"Laptop".to_string())
3271 );
3272 }
3273
3274 #[test]
3275 fn test_akp_for_option() {
3276 #[derive(Debug)]
3277 struct User {
3278 name: String,
3279 }
3280
3281 let some_user = Some(User {
3282 name: "Grace".to_string(),
3283 });
3284 let none_user: Option<User> = None;
3285
3286 let name_kp = KpType::new(|u: &User| Some(&u.name), |u: &mut User| Some(&mut u.name));
3287 let name_akp = AKp::new(name_kp);
3288
3289 let opt_akp = name_akp.for_option::<User>();
3291
3292 assert_eq!(
3293 opt_akp.get_as::<Option<User>, String>(&some_user),
3294 Some(Some(&"Grace".to_string()))
3295 );
3296 assert_eq!(
3297 opt_akp.get_as::<Option<User>, String>(&none_user),
3298 Some(None)
3299 );
3300 }
3301
3302 #[test]
3303 fn test_akp_for_result() {
3304 #[derive(Debug)]
3305 struct User {
3306 name: String,
3307 }
3308
3309 let ok_user: Result<User, String> = Ok(User {
3310 name: "Henry".to_string(),
3311 });
3312 let err_user: Result<User, String> = Err("Not found".to_string());
3313
3314 let name_kp = KpType::new(|u: &User| Some(&u.name), |u: &mut User| Some(&mut u.name));
3315 let name_akp = AKp::new(name_kp);
3316
3317 let result_akp = name_akp.for_result::<User, String>();
3319
3320 assert_eq!(
3321 result_akp.get_as::<Result<User, String>, String>(&ok_user),
3322 Some(Some(&"Henry".to_string()))
3323 );
3324 assert_eq!(
3325 result_akp.get_as::<Result<User, String>, String>(&err_user),
3326 Some(None)
3327 );
3328 }
3329
3330 #[test]
3333 fn test_kp_map() {
3334 #[derive(Debug)]
3335 struct User {
3336 name: String,
3337 age: i32,
3338 }
3339
3340 let user = User {
3341 name: "Akash".to_string(),
3342 age: 30,
3343 };
3344
3345 let name_kp = KpType::new(|u: &User| Some(&u.name), |u: &mut User| Some(&mut u.name));
3347 let len_kp = name_kp.map(|name: &String| name.len());
3348
3349 assert_eq!((len_kp.get)(&user), Some(5));
3350
3351 let age_kp = KpType::new(|u: &User| Some(&u.age), |u: &mut User| Some(&mut u.age));
3353 let double_age_kp = age_kp.map(|age: &i32| age * 2);
3354
3355 assert_eq!((double_age_kp.get)(&user), Some(60));
3356
3357 let is_adult_kp = age_kp.map(|age: &i32| *age >= 18);
3359 assert_eq!((is_adult_kp.get)(&user), Some(true));
3360 }
3361
3362 #[test]
3363 fn test_kp_filter() {
3364 #[derive(Debug)]
3365 struct User {
3366 name: String,
3367 age: i32,
3368 }
3369
3370 let adult = User {
3371 name: "Akash".to_string(),
3372 age: 30,
3373 };
3374
3375 let minor = User {
3376 name: "Bob".to_string(),
3377 age: 15,
3378 };
3379
3380 let age_kp = KpType::new(|u: &User| Some(&u.age), |u: &mut User| Some(&mut u.age));
3381 let adult_age_kp = age_kp.filter(|age: &i32| *age >= 18);
3382
3383 assert_eq!((adult_age_kp.get)(&adult), Some(&30));
3384 assert_eq!((adult_age_kp.get)(&minor), None);
3385
3386 let name_kp = KpType::new(|u: &User| Some(&u.name), |u: &mut User| Some(&mut u.name));
3388 let short_name_kp = name_kp.filter(|name: &String| name.len() <= 4);
3389
3390 assert_eq!((short_name_kp.get)(&minor), Some(&"Bob".to_string()));
3391 assert_eq!((short_name_kp.get)(&adult), None);
3392 }
3393
3394 #[test]
3395 fn test_kp_map_and_filter() {
3396 #[derive(Debug)]
3397 struct User {
3398 scores: Vec<i32>,
3399 }
3400
3401 let user = User {
3402 scores: vec![85, 92, 78, 95],
3403 };
3404
3405 let scores_kp = KpType::new(
3406 |u: &User| Some(&u.scores),
3407 |u: &mut User| Some(&mut u.scores),
3408 );
3409
3410 let avg_kp =
3412 scores_kp.map(|scores: &Vec<i32>| scores.iter().sum::<i32>() / scores.len() as i32);
3413
3414 let high_avg_kp = avg_kp.filter(|avg: &i32| *avg >= 85);
3416
3417 assert_eq!((high_avg_kp.get)(&user), Some(87)); }
3419
3420 #[test]
3421 fn test_enum_kp_map() {
3422 let ok_result: Result<String, i32> = Ok("hello".to_string());
3423 let err_result: Result<String, i32> = Err(42);
3424
3425 let ok_kp = enum_ok::<String, i32>();
3426 let len_kp = ok_kp.map(|s: &String| s.len());
3427
3428 assert_eq!(len_kp.get(&ok_result), Some(5));
3429 assert_eq!(len_kp.get(&err_result), None);
3430
3431 let some_opt = Some(vec![1, 2, 3, 4, 5]);
3433 let none_opt: Option<Vec<i32>> = None;
3434
3435 let some_kp = enum_some::<Vec<i32>>();
3436 let count_kp = some_kp.map(|vec: &Vec<i32>| vec.len());
3437
3438 assert_eq!(count_kp.get(&some_opt), Some(5));
3439 assert_eq!(count_kp.get(&none_opt), None);
3440 }
3441
3442 #[test]
3443 fn test_enum_kp_filter() {
3444 let ok_result1: Result<i32, String> = Ok(42);
3445 let ok_result2: Result<i32, String> = Ok(-5);
3446 let err_result: Result<i32, String> = Err("error".to_string());
3447
3448 let ok_kp = enum_ok::<i32, String>();
3449 let positive_kp = ok_kp.filter(|x: &i32| *x > 0);
3450
3451 assert_eq!((positive_kp.extractor.get)(&ok_result1), Some(&42));
3452 assert_eq!(positive_kp.get(&ok_result2), None); assert_eq!(positive_kp.get(&err_result), None); let long_str = Some("hello world".to_string());
3457 let short_str = Some("hi".to_string());
3458
3459 let some_kp = enum_some::<String>();
3460 let long_kp = some_kp.filter(|s: &String| s.len() > 5);
3461
3462 assert_eq!(long_kp.get(&long_str), Some(&"hello world".to_string()));
3463 assert_eq!(long_kp.get(&short_str), None);
3464 }
3465
3466 #[test]
3467 fn test_pkp_filter() {
3468 #[derive(Debug)]
3469 struct User {
3470 name: String,
3471 age: i32,
3472 }
3473
3474 let adult = User {
3475 name: "Akash".to_string(),
3476 age: 30,
3477 };
3478
3479 let minor = User {
3480 name: "Bob".to_string(),
3481 age: 15,
3482 };
3483
3484 let age_kp = KpType::new(|u: &User| Some(&u.age), |u: &mut User| Some(&mut u.age));
3485 let age_pkp = PKp::new(age_kp);
3486
3487 let adult_pkp = age_pkp.filter::<i32, _>(|age| *age >= 18);
3489
3490 assert_eq!(adult_pkp.get_as::<i32>(&adult), Some(&30));
3491 assert_eq!(adult_pkp.get_as::<i32>(&minor), None);
3492
3493 let name_kp = KpType::new(|u: &User| Some(&u.name), |u: &mut User| Some(&mut u.name));
3495 let name_pkp = PKp::new(name_kp);
3496 let short_name_pkp = name_pkp.filter::<String, _>(|name| name.len() <= 4);
3497
3498 assert_eq!(
3499 short_name_pkp.get_as::<String>(&minor),
3500 Some(&"Bob".to_string())
3501 );
3502 assert_eq!(short_name_pkp.get_as::<String>(&adult), None);
3503 }
3504
3505 #[test]
3506 fn test_akp_filter() {
3507 #[derive(Debug)]
3508 struct User {
3509 age: i32,
3510 }
3511
3512 #[derive(Debug)]
3513 struct Product {
3514 price: f64,
3515 }
3516
3517 let adult = User { age: 30 };
3518 let minor = User { age: 15 };
3519 let expensive = Product { price: 99.99 };
3520 let cheap = Product { price: 5.0 };
3521
3522 let age_kp = KpType::new(|u: &User| Some(&u.age), |u: &mut User| Some(&mut u.age));
3524 let age_akp = AKp::new(age_kp);
3525 let adult_akp = age_akp.filter::<User, i32, _>(|age| *age >= 18);
3526
3527 assert_eq!(adult_akp.get_as::<User, i32>(&adult), Some(Some(&30)));
3528 assert_eq!(adult_akp.get_as::<User, i32>(&minor), Some(None));
3529
3530 let price_kp = KpType::new(
3532 |p: &Product| Some(&p.price),
3533 |p: &mut Product| Some(&mut p.price),
3534 );
3535 let price_akp = AKp::new(price_kp);
3536 let expensive_akp = price_akp.filter::<Product, f64, _>(|price| *price > 50.0);
3537
3538 assert_eq!(
3539 expensive_akp.get_as::<Product, f64>(&expensive),
3540 Some(Some(&99.99))
3541 );
3542 assert_eq!(expensive_akp.get_as::<Product, f64>(&cheap), Some(None));
3543 }
3544
3545 #[test]
3548 fn test_kp_filter_map() {
3549 #[derive(Debug)]
3550 struct User {
3551 middle_name: Option<String>,
3552 }
3553
3554 let user_with = User {
3555 middle_name: Some("Marie".to_string()),
3556 };
3557 let user_without = User { middle_name: None };
3558
3559 let middle_kp = KpType::new(
3560 |u: &User| Some(&u.middle_name),
3561 |u: &mut User| Some(&mut u.middle_name),
3562 );
3563
3564 let first_char_kp = middle_kp
3565 .filter_map(|opt: &Option<String>| opt.as_ref().and_then(|s| s.chars().next()));
3566
3567 assert_eq!((first_char_kp.get)(&user_with), Some('M'));
3568 assert_eq!((first_char_kp.get)(&user_without), None);
3569 }
3570
3571 #[test]
3572 fn test_kp_inspect() {
3573 #[derive(Debug)]
3574 struct User {
3575 name: String,
3576 }
3577
3578 let user = User {
3579 name: "Akash".to_string(),
3580 };
3581
3582 let name_kp = KpType::new(|u: &User| Some(&u.name), |u: &mut User| Some(&mut u.name));
3586
3587 let result = (name_kp.get)(&user);
3590 assert_eq!(result, Some(&"Akash".to_string()));
3591
3592 }
3595
3596 #[test]
3597 fn test_kp_fold_value() {
3598 #[derive(Debug)]
3599 struct User {
3600 scores: Vec<i32>,
3601 }
3602
3603 let user = User {
3604 scores: vec![85, 92, 78, 95],
3605 };
3606
3607 let scores_kp = KpType::new(
3608 |u: &User| Some(&u.scores),
3609 |u: &mut User| Some(&mut u.scores),
3610 );
3611
3612 let sum_fn =
3614 scores_kp.fold_value(0, |acc, scores: &Vec<i32>| scores.iter().sum::<i32>() + acc);
3615
3616 assert_eq!(sum_fn(&user), 350);
3617 }
3618
3619 #[test]
3620 fn test_kp_any_all() {
3621 #[derive(Debug)]
3622 struct User {
3623 scores: Vec<i32>,
3624 }
3625
3626 let user_high = User {
3627 scores: vec![85, 92, 88],
3628 };
3629 let user_mixed = User {
3630 scores: vec![65, 92, 78],
3631 };
3632
3633 let scores_kp = KpType::new(
3634 |u: &User| Some(&u.scores),
3635 |u: &mut User| Some(&mut u.scores),
3636 );
3637
3638 let has_high_fn = scores_kp.any(|scores: &Vec<i32>| scores.iter().any(|&s| s > 90));
3640 assert!(has_high_fn(&user_high));
3641 assert!(has_high_fn(&user_mixed));
3642
3643 let all_passing_fn = scores_kp.all(|scores: &Vec<i32>| scores.iter().all(|&s| s >= 80));
3645 assert!(all_passing_fn(&user_high));
3646 assert!(!all_passing_fn(&user_mixed));
3647 }
3648
3649 #[test]
3650 fn test_kp_count_items() {
3651 #[derive(Debug)]
3652 struct User {
3653 tags: Vec<String>,
3654 }
3655
3656 let user = User {
3657 tags: vec!["rust".to_string(), "web".to_string(), "backend".to_string()],
3658 };
3659
3660 let tags_kp = KpType::new(|u: &User| Some(&u.tags), |u: &mut User| Some(&mut u.tags));
3661 let count_fn = tags_kp.count_items(|tags: &Vec<String>| tags.len());
3662
3663 assert_eq!(count_fn(&user), Some(3));
3664 }
3665
3666 #[test]
3667 fn test_kp_find_in() {
3668 #[derive(Debug)]
3669 struct User {
3670 scores: Vec<i32>,
3671 }
3672
3673 let user = User {
3674 scores: vec![85, 92, 78, 95, 88],
3675 };
3676
3677 let scores_kp = KpType::new(
3678 |u: &User| Some(&u.scores),
3679 |u: &mut User| Some(&mut u.scores),
3680 );
3681
3682 let first_high_fn =
3684 scores_kp.find_in(|scores: &Vec<i32>| scores.iter().find(|&&s| s > 90).copied());
3685
3686 assert_eq!(first_high_fn(&user), Some(92));
3687
3688 let perfect_fn =
3690 scores_kp.find_in(|scores: &Vec<i32>| scores.iter().find(|&&s| s > 100).copied());
3691
3692 assert_eq!(perfect_fn(&user), None);
3693 }
3694
3695 #[test]
3696 fn test_kp_take_skip() {
3697 #[derive(Debug)]
3698 struct User {
3699 tags: Vec<String>,
3700 }
3701
3702 let user = User {
3703 tags: vec![
3704 "a".to_string(),
3705 "b".to_string(),
3706 "c".to_string(),
3707 "d".to_string(),
3708 ],
3709 };
3710
3711 let tags_kp = KpType::new(|u: &User| Some(&u.tags), |u: &mut User| Some(&mut u.tags));
3712
3713 let take_fn = tags_kp.take(2, |tags: &Vec<String>, n| {
3715 tags.iter().take(n).cloned().collect::<Vec<_>>()
3716 });
3717
3718 let taken = take_fn(&user).unwrap();
3719 assert_eq!(taken, vec!["a".to_string(), "b".to_string()]);
3720
3721 let skip_fn = tags_kp.skip(2, |tags: &Vec<String>, n| {
3723 tags.iter().skip(n).cloned().collect::<Vec<_>>()
3724 });
3725
3726 let skipped = skip_fn(&user).unwrap();
3727 assert_eq!(skipped, vec!["c".to_string(), "d".to_string()]);
3728 }
3729
3730 #[test]
3731 fn test_kp_partition() {
3732 #[derive(Debug)]
3733 struct User {
3734 scores: Vec<i32>,
3735 }
3736
3737 let user = User {
3738 scores: vec![85, 92, 65, 95, 72, 58],
3739 };
3740
3741 let scores_kp = KpType::new(
3742 |u: &User| Some(&u.scores),
3743 |u: &mut User| Some(&mut u.scores),
3744 );
3745
3746 let partition_fn = scores_kp.partition_value(|scores: &Vec<i32>| -> (Vec<i32>, Vec<i32>) {
3747 scores.iter().copied().partition(|&s| s >= 70)
3748 });
3749
3750 let (passing, failing) = partition_fn(&user).unwrap();
3751 assert_eq!(passing, vec![85, 92, 95, 72]);
3752 assert_eq!(failing, vec![65, 58]);
3753 }
3754
3755 #[test]
3756 fn test_kp_min_max() {
3757 #[derive(Debug)]
3758 struct User {
3759 scores: Vec<i32>,
3760 }
3761
3762 let user = User {
3763 scores: vec![85, 92, 78, 95, 88],
3764 };
3765
3766 let scores_kp = KpType::new(
3767 |u: &User| Some(&u.scores),
3768 |u: &mut User| Some(&mut u.scores),
3769 );
3770
3771 let min_fn = scores_kp.min_value(|scores: &Vec<i32>| scores.iter().min().copied());
3773 assert_eq!(min_fn(&user), Some(78));
3774
3775 let max_fn = scores_kp.max_value(|scores: &Vec<i32>| scores.iter().max().copied());
3777 assert_eq!(max_fn(&user), Some(95));
3778 }
3779
3780 #[test]
3781 fn test_kp_sum() {
3782 #[derive(Debug)]
3783 struct User {
3784 scores: Vec<i32>,
3785 }
3786
3787 let user = User {
3788 scores: vec![85, 92, 78],
3789 };
3790
3791 let scores_kp = KpType::new(
3792 |u: &User| Some(&u.scores),
3793 |u: &mut User| Some(&mut u.scores),
3794 );
3795
3796 let sum_fn = scores_kp.sum_value(|scores: &Vec<i32>| scores.iter().sum::<i32>());
3797 assert_eq!(sum_fn(&user), Some(255));
3798
3799 let avg_fn =
3801 scores_kp.map(|scores: &Vec<i32>| scores.iter().sum::<i32>() / scores.len() as i32);
3802 assert_eq!(avg_fn.get(&user), Some(85));
3803 }
3804
3805 #[test]
3806 fn test_kp_chain() {
3807 #[derive(Debug)]
3808 struct User {
3809 profile: Profile,
3810 }
3811
3812 #[derive(Debug)]
3813 struct Profile {
3814 settings: Settings,
3815 }
3816
3817 #[derive(Debug)]
3818 struct Settings {
3819 theme: String,
3820 }
3821
3822 let user = User {
3823 profile: Profile {
3824 settings: Settings {
3825 theme: "dark".to_string(),
3826 },
3827 },
3828 };
3829
3830 let profile_kp = KpType::new(
3831 |u: &User| Some(&u.profile),
3832 |u: &mut User| Some(&mut u.profile),
3833 );
3834 let settings_kp = KpType::new(
3835 |p: &Profile| Some(&p.settings),
3836 |p: &mut Profile| Some(&mut p.settings),
3837 );
3838 let theme_kp = KpType::new(
3839 |s: &Settings| Some(&s.theme),
3840 |s: &mut Settings| Some(&mut s.theme),
3841 );
3842
3843 let profile_settings = profile_kp.then(settings_kp);
3845 let theme_path = profile_settings.then(theme_kp);
3846 assert_eq!(theme_path.get(&user), Some(&"dark".to_string()));
3847 }
3848
3849 #[test]
3850 fn test_kp_zip() {
3851 #[derive(Debug)]
3852 struct User {
3853 name: String,
3854 age: i32,
3855 }
3856
3857 let user = User {
3858 name: "Akash".to_string(),
3859 age: 30,
3860 };
3861
3862 let name_kp = KpType::new(|u: &User| Some(&u.name), |u: &mut User| Some(&mut u.name));
3863 let age_kp = KpType::new(|u: &User| Some(&u.age), |u: &mut User| Some(&mut u.age));
3864
3865 let zipped_fn = zip_kps(&name_kp, &age_kp);
3866 let result = zipped_fn(&user);
3867
3868 assert_eq!(result, Some((&"Akash".to_string(), &30)));
3869 }
3870
3871 #[test]
3872 fn test_kp_complex_pipeline() {
3873 #[derive(Debug)]
3874 struct User {
3875 transactions: Vec<Transaction>,
3876 }
3877
3878 #[derive(Debug)]
3879 struct Transaction {
3880 amount: f64,
3881 category: String,
3882 }
3883
3884 let user = User {
3885 transactions: vec![
3886 Transaction {
3887 amount: 50.0,
3888 category: "food".to_string(),
3889 },
3890 Transaction {
3891 amount: 100.0,
3892 category: "transport".to_string(),
3893 },
3894 Transaction {
3895 amount: 25.0,
3896 category: "food".to_string(),
3897 },
3898 Transaction {
3899 amount: 200.0,
3900 category: "shopping".to_string(),
3901 },
3902 ],
3903 };
3904
3905 let txns_kp = KpType::new(
3906 |u: &User| Some(&u.transactions),
3907 |u: &mut User| Some(&mut u.transactions),
3908 );
3909
3910 let food_total = txns_kp.map(|txns: &Vec<Transaction>| {
3912 txns.iter()
3913 .filter(|t| t.category == "food")
3914 .map(|t| t.amount)
3915 .sum::<f64>()
3916 });
3917
3918 assert_eq!(food_total.get(&user), Some(75.0));
3919
3920 let has_large =
3922 txns_kp.any(|txns: &Vec<Transaction>| txns.iter().any(|t| t.amount > 150.0));
3923
3924 assert!(has_large(&user));
3925
3926 let count = txns_kp.count_items(|txns: &Vec<Transaction>| txns.len());
3928 assert_eq!(count(&user), Some(4));
3929 }
3930
3931 #[test]
3935 fn test_no_clone_required_for_root() {
3936 use std::sync::Arc;
3937 use std::sync::atomic::{AtomicUsize, Ordering};
3938
3939 struct NonCloneableRoot {
3942 data: Arc<AtomicUsize>,
3943 cached_value: usize,
3944 }
3945
3946 impl NonCloneableRoot {
3947 fn new() -> Self {
3948 Self {
3949 data: Arc::new(AtomicUsize::new(42)),
3950 cached_value: 42,
3951 }
3952 }
3953
3954 fn increment(&mut self) {
3955 self.data.fetch_add(1, Ordering::SeqCst);
3956 self.cached_value = self.data.load(Ordering::SeqCst);
3957 }
3958
3959 fn get_value(&self) -> &usize {
3960 &self.cached_value
3961 }
3962
3963 fn get_value_mut(&mut self) -> &mut usize {
3964 &mut self.cached_value
3965 }
3966 }
3967
3968 let mut root = NonCloneableRoot::new();
3969
3970 let data_kp = KpType::new(
3972 |r: &NonCloneableRoot| Some(r.get_value()),
3973 |r: &mut NonCloneableRoot| {
3974 r.increment();
3975 Some(r.get_value_mut())
3976 },
3977 );
3978
3979 assert_eq!(data_kp.get(&root), Some(&42));
3981
3982 {
3983 let doubled = data_kp.map(|val: &usize| val * 2);
3985 assert_eq!(doubled.get(&root), Some(84));
3986
3987 let filtered = data_kp.filter(|val: &usize| *val > 0);
3989 assert_eq!(filtered.get(&root), Some(&42));
3990 } let value_ref = data_kp.get_mut(&mut root);
3994 assert!(value_ref.is_some());
3995 }
3996
3997 #[test]
3998 fn test_no_clone_required_for_value() {
3999 use std::sync::Arc;
4000 use std::sync::atomic::{AtomicUsize, Ordering};
4001
4002 struct NonCloneableValue {
4004 counter: Arc<AtomicUsize>,
4005 }
4006
4007 impl NonCloneableValue {
4008 fn new(val: usize) -> Self {
4009 Self {
4010 counter: Arc::new(AtomicUsize::new(val)),
4011 }
4012 }
4013
4014 fn get(&self) -> usize {
4015 self.counter.load(Ordering::SeqCst)
4016 }
4017 }
4018
4019 struct Root {
4020 value: NonCloneableValue,
4021 }
4022
4023 let root = Root {
4024 value: NonCloneableValue::new(100),
4025 };
4026
4027 let value_kp = KpType::new(|r: &Root| Some(&r.value), |r: &mut Root| Some(&mut r.value));
4029
4030 let counter_kp = value_kp.map(|v: &NonCloneableValue| v.get());
4032 assert_eq!(counter_kp.get(&root), Some(100));
4033
4034 let filtered = value_kp.filter(|v: &NonCloneableValue| v.get() >= 50);
4036 assert!(filtered.get(&root).is_some());
4037 }
4038
4039 #[test]
4040 fn test_static_does_not_leak_memory() {
4041 use std::sync::Arc;
4042 use std::sync::atomic::{AtomicUsize, Ordering};
4043
4044 static CREATED: AtomicUsize = AtomicUsize::new(0);
4046 static DROPPED: AtomicUsize = AtomicUsize::new(0);
4047
4048 struct Tracked {
4049 id: usize,
4050 }
4051
4052 impl Tracked {
4053 fn new() -> Self {
4054 let id = CREATED.fetch_add(1, Ordering::SeqCst);
4055 Self { id }
4056 }
4057 }
4058
4059 impl Drop for Tracked {
4060 fn drop(&mut self) {
4061 DROPPED.fetch_add(1, Ordering::SeqCst);
4062 }
4063 }
4064
4065 struct Root {
4066 data: Tracked,
4067 }
4068
4069 CREATED.store(0, Ordering::SeqCst);
4071 DROPPED.store(0, Ordering::SeqCst);
4072
4073 {
4074 let root = Root {
4075 data: Tracked::new(),
4076 };
4077
4078 let data_kp = KpType::new(|r: &Root| Some(&r.data), |r: &mut Root| Some(&mut r.data));
4079
4080 let mapped1 = data_kp.map(|t: &Tracked| t.id);
4082 let mapped2 = data_kp.map(|t: &Tracked| t.id + 1);
4083 let mapped3 = data_kp.map(|t: &Tracked| t.id + 2);
4084
4085 assert_eq!(mapped1.get(&root), Some(0));
4086 assert_eq!(mapped2.get(&root), Some(1));
4087 assert_eq!(mapped3.get(&root), Some(2));
4088
4089 assert_eq!(CREATED.load(Ordering::SeqCst), 1);
4091 assert_eq!(DROPPED.load(Ordering::SeqCst), 0);
4092 }
4093
4094 assert_eq!(CREATED.load(Ordering::SeqCst), 1);
4096 assert_eq!(DROPPED.load(Ordering::SeqCst), 1);
4097
4098 }
4100
4101 #[test]
4102 fn test_references_not_cloned() {
4103 use std::sync::Arc;
4104
4105 struct ExpensiveData {
4107 large_vec: Vec<u8>,
4108 }
4109
4110 impl ExpensiveData {
4111 fn new(size: usize) -> Self {
4112 Self {
4113 large_vec: vec![0u8; size],
4114 }
4115 }
4116
4117 fn size(&self) -> usize {
4118 self.large_vec.len()
4119 }
4120 }
4121
4122 struct Root {
4123 expensive: ExpensiveData,
4124 }
4125
4126 let root = Root {
4127 expensive: ExpensiveData::new(1_000_000), };
4129
4130 let expensive_kp = KpType::new(
4131 |r: &Root| Some(&r.expensive),
4132 |r: &mut Root| Some(&mut r.expensive),
4133 );
4134
4135 let size_kp = expensive_kp.map(|e: &ExpensiveData| e.size());
4137 assert_eq!(size_kp.get(&root), Some(1_000_000));
4138
4139 let large_filter = expensive_kp.filter(|e: &ExpensiveData| e.size() > 500_000);
4141 assert!(large_filter.get(&root).is_some());
4142
4143 }
4145
4146 #[test]
4147 fn test_hof_with_arc_no_extra_clones() {
4148 use std::sync::Arc;
4149
4150 #[derive(Debug)]
4151 struct SharedData {
4152 value: String,
4153 }
4154
4155 struct Root {
4156 shared: Arc<SharedData>,
4157 }
4158
4159 let shared = Arc::new(SharedData {
4160 value: "shared".to_string(),
4161 });
4162
4163 assert_eq!(Arc::strong_count(&shared), 1);
4165
4166 {
4167 let root = Root {
4168 shared: Arc::clone(&shared),
4169 };
4170
4171 assert_eq!(Arc::strong_count(&shared), 2);
4173
4174 let shared_kp = KpType::new(
4175 |r: &Root| Some(&r.shared),
4176 |r: &mut Root| Some(&mut r.shared),
4177 );
4178
4179 let value_kp = shared_kp.map(|arc: &Arc<SharedData>| arc.value.len());
4181
4182 assert_eq!(value_kp.get(&root), Some(6));
4184 assert_eq!(Arc::strong_count(&shared), 2); let filtered = shared_kp.filter(|arc: &Arc<SharedData>| !arc.value.is_empty());
4188 assert!(filtered.get(&root).is_some());
4189 assert_eq!(Arc::strong_count(&shared), 2); } assert_eq!(Arc::strong_count(&shared), 1); }
4194
4195 #[test]
4196 fn test_closure_captures_not_root_values() {
4197 use std::sync::Arc;
4198 use std::sync::atomic::{AtomicUsize, Ordering};
4199
4200 let call_count = Arc::new(AtomicUsize::new(0));
4202 let call_count_clone = Arc::clone(&call_count);
4203
4204 struct Root {
4205 value: i32,
4206 }
4207
4208 let root = Root { value: 42 };
4209
4210 let value_kp = KpType::new(|r: &Root| Some(&r.value), |r: &mut Root| Some(&mut r.value));
4211
4212 let doubled = value_kp.fold_value(0, move |_acc, v: &i32| {
4215 call_count_clone.fetch_add(1, Ordering::SeqCst);
4216 v * 2
4217 });
4218
4219 assert_eq!(doubled(&root), 84);
4221 assert_eq!(doubled(&root), 84);
4222 assert_eq!(doubled(&root), 84);
4223
4224 assert_eq!(call_count.load(Ordering::SeqCst), 3);
4226
4227 }
4229
4230 #[test]
4231 fn test_static_with_borrowed_data() {
4232 struct Root {
4236 data: String,
4237 }
4238
4239 {
4240 let root = Root {
4241 data: "temporary".to_string(),
4242 };
4243
4244 let data_kp = KpType::new(|r: &Root| Some(&r.data), |r: &mut Root| Some(&mut r.data));
4245
4246 let len_kp = data_kp.map(|s: &String| s.len());
4248 assert_eq!(len_kp.get(&root), Some(9));
4249
4250 } }
4255
4256 #[test]
4257 fn test_multiple_hof_operations_no_accumulation() {
4258 use std::sync::Arc;
4259 use std::sync::atomic::{AtomicUsize, Ordering};
4260
4261 static DROP_COUNT: AtomicUsize = AtomicUsize::new(0);
4262
4263 struct Tracked {
4264 id: usize,
4265 }
4266
4267 impl Drop for Tracked {
4268 fn drop(&mut self) {
4269 DROP_COUNT.fetch_add(1, Ordering::SeqCst);
4270 }
4271 }
4272
4273 struct Root {
4274 values: Vec<Tracked>,
4275 }
4276
4277 DROP_COUNT.store(0, Ordering::SeqCst);
4278
4279 {
4280 let root = Root {
4281 values: vec![Tracked { id: 1 }, Tracked { id: 2 }, Tracked { id: 3 }],
4282 };
4283
4284 let values_kp = KpType::new(
4285 |r: &Root| Some(&r.values),
4286 |r: &mut Root| Some(&mut r.values),
4287 );
4288
4289 let count = values_kp.count_items(|v| v.len());
4291 let sum = values_kp.sum_value(|v| v.iter().map(|t| t.id).sum::<usize>());
4292 let has_2 = values_kp.any(|v| v.iter().any(|t| t.id == 2));
4293 let all_positive = values_kp.all(|v| v.iter().all(|t| t.id > 0));
4294
4295 assert_eq!(count(&root), Some(3));
4296 assert_eq!(sum(&root), Some(6));
4297 assert!(has_2(&root));
4298 assert!(all_positive(&root));
4299
4300 assert_eq!(DROP_COUNT.load(Ordering::SeqCst), 0);
4302 }
4303
4304 assert_eq!(DROP_COUNT.load(Ordering::SeqCst), 3);
4306 }
4307
4308 #[test]
4309 fn test_copy_bound_only_for_function_not_data() {
4310 #[derive(Debug)]
4314 struct NonCopyData {
4315 value: String,
4316 }
4317
4318 struct Root {
4319 data: NonCopyData,
4320 }
4321
4322 let root = Root {
4323 data: NonCopyData {
4324 value: "test".to_string(),
4325 },
4326 };
4327
4328 let data_kp = KpType::new(|r: &Root| Some(&r.data), |r: &mut Root| Some(&mut r.data));
4329
4330 let len_kp = data_kp.map(|d: &NonCopyData| d.value.len());
4333 assert_eq!(len_kp.get(&root), Some(4));
4334
4335 let filtered = data_kp.filter(|d: &NonCopyData| !d.value.is_empty());
4337 assert!(filtered.get(&root).is_some());
4338 }
4339
4340 #[test]
4341 fn test_no_memory_leak_with_cyclic_references() {
4342 use std::sync::atomic::{AtomicUsize, Ordering};
4343 use std::sync::{Arc, Weak};
4344
4345 static DROP_COUNT: AtomicUsize = AtomicUsize::new(0);
4346
4347 struct Node {
4348 id: usize,
4349 parent: Option<Weak<Node>>,
4350 }
4351
4352 impl Drop for Node {
4353 fn drop(&mut self) {
4354 DROP_COUNT.fetch_add(1, Ordering::SeqCst);
4355 }
4356 }
4357
4358 struct Root {
4359 node: Arc<Node>,
4360 }
4361
4362 DROP_COUNT.store(0, Ordering::SeqCst);
4363
4364 {
4365 let root = Root {
4366 node: Arc::new(Node {
4367 id: 1,
4368 parent: None,
4369 }),
4370 };
4371
4372 let node_kp = KpType::new(|r: &Root| Some(&r.node), |r: &mut Root| Some(&mut r.node));
4373
4374 let id_kp = node_kp.map(|n: &Arc<Node>| n.id);
4376 assert_eq!(id_kp.get(&root), Some(1));
4377
4378 assert_eq!(Arc::strong_count(&root.node), 1);
4380
4381 assert_eq!(DROP_COUNT.load(Ordering::SeqCst), 0);
4383 }
4384
4385 assert_eq!(DROP_COUNT.load(Ordering::SeqCst), 1);
4387 }
4388
4389 #[test]
4390 fn test_hof_operations_are_zero_cost_abstractions() {
4391 struct Root {
4395 value: i32,
4396 }
4397
4398 let root = Root { value: 10 };
4399
4400 let value_kp = KpType::new(|r: &Root| Some(&r.value), |r: &mut Root| Some(&mut r.value));
4401
4402 let direct_result = value_kp.get(&root).map(|v| v * 2);
4404 assert_eq!(direct_result, Some(20));
4405
4406 let mapped_kp = value_kp.map(|v: &i32| v * 2);
4408 let hof_result = mapped_kp.get(&root);
4409 assert_eq!(hof_result, Some(20));
4410
4411 assert_eq!(direct_result, hof_result);
4413 }
4414
4415 #[test]
4416 fn test_complex_closure_captures_allowed() {
4417 use std::sync::Arc;
4418
4419 struct Root {
4421 scores: Vec<i32>,
4422 }
4423
4424 let root = Root {
4425 scores: vec![85, 92, 78, 95, 88],
4426 };
4427
4428 let scores_kp = KpType::new(
4429 |r: &Root| Some(&r.scores),
4430 |r: &mut Root| Some(&mut r.scores),
4431 );
4432
4433 let threshold = 90;
4435 let multiplier = Arc::new(2);
4436
4437 let high_scores_doubled = scores_kp.fold_value(0, move |acc, scores| {
4439 let high: i32 = scores
4440 .iter()
4441 .filter(|&&s| s >= threshold)
4442 .map(|&s| s * *multiplier)
4443 .sum();
4444 acc + high
4445 });
4446
4447 assert_eq!(high_scores_doubled(&root), 374);
4449 }
4450
4451 #[test]
4455 fn test_pkp_filter_by_value_type() {
4456 use std::any::TypeId;
4457
4458 #[derive(Debug)]
4459 struct User {
4460 name: String,
4461 age: i32,
4462 score: f64,
4463 active: bool,
4464 }
4465
4466 let user = User {
4467 name: "Akash".to_string(),
4468 age: 30,
4469 score: 95.5,
4470 active: true,
4471 };
4472
4473 let name_kp = KpType::new(|u: &User| Some(&u.name), |u: &mut User| Some(&mut u.name));
4475 let age_kp = KpType::new(|u: &User| Some(&u.age), |u: &mut User| Some(&mut u.age));
4476 let score_kp = KpType::new(|u: &User| Some(&u.score), |u: &mut User| Some(&mut u.score));
4477 let active_kp = KpType::new(
4478 |u: &User| Some(&u.active),
4479 |u: &mut User| Some(&mut u.active),
4480 );
4481
4482 let all_keypaths: Vec<PKp<User>> = vec![
4484 PKp::new(name_kp),
4485 PKp::new(age_kp),
4486 PKp::new(score_kp),
4487 PKp::new(active_kp),
4488 ];
4489
4490 let string_kps: Vec<_> = all_keypaths
4492 .iter()
4493 .filter(|pkp| pkp.value_type_id() == TypeId::of::<String>())
4494 .collect();
4495
4496 assert_eq!(string_kps.len(), 1);
4497 assert_eq!(
4498 string_kps[0].get_as::<String>(&user),
4499 Some(&"Akash".to_string())
4500 );
4501
4502 let i32_kps: Vec<_> = all_keypaths
4504 .iter()
4505 .filter(|pkp| pkp.value_type_id() == TypeId::of::<i32>())
4506 .collect();
4507
4508 assert_eq!(i32_kps.len(), 1);
4509 assert_eq!(i32_kps[0].get_as::<i32>(&user), Some(&30));
4510
4511 let f64_kps: Vec<_> = all_keypaths
4513 .iter()
4514 .filter(|pkp| pkp.value_type_id() == TypeId::of::<f64>())
4515 .collect();
4516
4517 assert_eq!(f64_kps.len(), 1);
4518 assert_eq!(f64_kps[0].get_as::<f64>(&user), Some(&95.5));
4519
4520 let bool_kps: Vec<_> = all_keypaths
4522 .iter()
4523 .filter(|pkp| pkp.value_type_id() == TypeId::of::<bool>())
4524 .collect();
4525
4526 assert_eq!(bool_kps.len(), 1);
4527 assert_eq!(bool_kps[0].get_as::<bool>(&user), Some(&true));
4528 }
4529
4530 #[test]
4531 fn test_pkp_filter_by_struct_type() {
4532 use std::any::TypeId;
4533
4534 #[derive(Debug, PartialEq)]
4535 struct Address {
4536 street: String,
4537 city: String,
4538 }
4539
4540 #[derive(Debug)]
4541 struct User {
4542 name: String,
4543 age: i32,
4544 address: Address,
4545 }
4546
4547 let user = User {
4548 name: "Bob".to_string(),
4549 age: 25,
4550 address: Address {
4551 street: "123 Main St".to_string(),
4552 city: "NYC".to_string(),
4553 },
4554 };
4555
4556 let name_kp = KpType::new(|u: &User| Some(&u.name), |u: &mut User| Some(&mut u.name));
4558 let age_kp = KpType::new(|u: &User| Some(&u.age), |u: &mut User| Some(&mut u.age));
4559 let address_kp = KpType::new(
4560 |u: &User| Some(&u.address),
4561 |u: &mut User| Some(&mut u.address),
4562 );
4563
4564 let all_keypaths: Vec<PKp<User>> =
4565 vec![PKp::new(name_kp), PKp::new(age_kp), PKp::new(address_kp)];
4566
4567 let struct_kps: Vec<_> = all_keypaths
4569 .iter()
4570 .filter(|pkp| pkp.value_type_id() == TypeId::of::<Address>())
4571 .collect();
4572
4573 assert_eq!(struct_kps.len(), 1);
4574 assert_eq!(
4575 struct_kps[0].get_as::<Address>(&user),
4576 Some(&Address {
4577 street: "123 Main St".to_string(),
4578 city: "NYC".to_string(),
4579 })
4580 );
4581
4582 let primitive_kps: Vec<_> = all_keypaths
4584 .iter()
4585 .filter(|pkp| {
4586 pkp.value_type_id() == TypeId::of::<String>()
4587 || pkp.value_type_id() == TypeId::of::<i32>()
4588 })
4589 .collect();
4590
4591 assert_eq!(primitive_kps.len(), 2);
4592 }
4593
4594 #[test]
4595 fn test_pkp_filter_by_arc_type() {
4596 use std::any::TypeId;
4597 use std::sync::Arc;
4598
4599 #[derive(Debug)]
4600 struct User {
4601 name: String,
4602 shared_data: Arc<String>,
4603 shared_number: Arc<i32>,
4604 }
4605
4606 let user = User {
4607 name: "Charlie".to_string(),
4608 shared_data: Arc::new("shared".to_string()),
4609 shared_number: Arc::new(42),
4610 };
4611
4612 let name_kp = KpType::new(|u: &User| Some(&u.name), |u: &mut User| Some(&mut u.name));
4614 let shared_data_kp = KpType::new(
4615 |u: &User| Some(&u.shared_data),
4616 |u: &mut User| Some(&mut u.shared_data),
4617 );
4618 let shared_number_kp = KpType::new(
4619 |u: &User| Some(&u.shared_number),
4620 |u: &mut User| Some(&mut u.shared_number),
4621 );
4622
4623 let all_keypaths: Vec<PKp<User>> = vec![
4624 PKp::new(name_kp),
4625 PKp::new(shared_data_kp),
4626 PKp::new(shared_number_kp),
4627 ];
4628
4629 let arc_string_kps: Vec<_> = all_keypaths
4631 .iter()
4632 .filter(|pkp| pkp.value_type_id() == TypeId::of::<Arc<String>>())
4633 .collect();
4634
4635 assert_eq!(arc_string_kps.len(), 1);
4636 assert_eq!(
4637 arc_string_kps[0]
4638 .get_as::<Arc<String>>(&user)
4639 .map(|arc| arc.as_str()),
4640 Some("shared")
4641 );
4642
4643 let arc_i32_kps: Vec<_> = all_keypaths
4645 .iter()
4646 .filter(|pkp| pkp.value_type_id() == TypeId::of::<Arc<i32>>())
4647 .collect();
4648
4649 assert_eq!(arc_i32_kps.len(), 1);
4650 assert_eq!(
4651 arc_i32_kps[0].get_as::<Arc<i32>>(&user).map(|arc| **arc),
4652 Some(42)
4653 );
4654
4655 let all_arc_kps: Vec<_> = all_keypaths
4657 .iter()
4658 .filter(|pkp| {
4659 pkp.value_type_id() == TypeId::of::<Arc<String>>()
4660 || pkp.value_type_id() == TypeId::of::<Arc<i32>>()
4661 })
4662 .collect();
4663
4664 assert_eq!(all_arc_kps.len(), 2);
4665 }
4666
4667 #[test]
4668 fn test_pkp_filter_by_box_type() {
4669 use std::any::TypeId;
4670
4671 #[derive(Debug)]
4672 struct User {
4673 name: String,
4674 boxed_value: Box<i32>,
4675 boxed_string: Box<String>,
4676 }
4677
4678 let user = User {
4679 name: "Diana".to_string(),
4680 boxed_value: Box::new(100),
4681 boxed_string: Box::new("boxed".to_string()),
4682 };
4683
4684 let name_kp = KpType::new(|u: &User| Some(&u.name), |u: &mut User| Some(&mut u.name));
4686 let boxed_value_kp = KpType::new(
4687 |u: &User| Some(&u.boxed_value),
4688 |u: &mut User| Some(&mut u.boxed_value),
4689 );
4690 let boxed_string_kp = KpType::new(
4691 |u: &User| Some(&u.boxed_string),
4692 |u: &mut User| Some(&mut u.boxed_string),
4693 );
4694
4695 let all_keypaths: Vec<PKp<User>> = vec![
4696 PKp::new(name_kp),
4697 PKp::new(boxed_value_kp),
4698 PKp::new(boxed_string_kp),
4699 ];
4700
4701 let box_i32_kps: Vec<_> = all_keypaths
4703 .iter()
4704 .filter(|pkp| pkp.value_type_id() == TypeId::of::<Box<i32>>())
4705 .collect();
4706
4707 assert_eq!(box_i32_kps.len(), 1);
4708 assert_eq!(
4709 box_i32_kps[0].get_as::<Box<i32>>(&user).map(|b| **b),
4710 Some(100)
4711 );
4712
4713 let box_string_kps: Vec<_> = all_keypaths
4715 .iter()
4716 .filter(|pkp| pkp.value_type_id() == TypeId::of::<Box<String>>())
4717 .collect();
4718
4719 assert_eq!(box_string_kps.len(), 1);
4720 assert_eq!(
4721 box_string_kps[0]
4722 .get_as::<Box<String>>(&user)
4723 .map(|b| b.as_str()),
4724 Some("boxed")
4725 );
4726 }
4727
4728 #[test]
4729 fn test_akp_filter_by_root_and_value_type() {
4730 use std::any::TypeId;
4731
4732 #[derive(Debug)]
4733 struct User {
4734 name: String,
4735 age: i32,
4736 }
4737
4738 #[derive(Debug)]
4739 struct Product {
4740 title: String,
4741 price: f64,
4742 }
4743
4744 let user = User {
4745 name: "Eve".to_string(),
4746 age: 28,
4747 };
4748
4749 let product = Product {
4750 title: "Book".to_string(),
4751 price: 19.99,
4752 };
4753
4754 let user_name_kp = KpType::new(|u: &User| Some(&u.name), |u: &mut User| Some(&mut u.name));
4756 let user_age_kp = KpType::new(|u: &User| Some(&u.age), |u: &mut User| Some(&mut u.age));
4757 let product_title_kp = KpType::new(
4758 |p: &Product| Some(&p.title),
4759 |p: &mut Product| Some(&mut p.title),
4760 );
4761 let product_price_kp = KpType::new(
4762 |p: &Product| Some(&p.price),
4763 |p: &mut Product| Some(&mut p.price),
4764 );
4765
4766 let all_keypaths: Vec<AKp> = vec![
4767 AKp::new(user_name_kp),
4768 AKp::new(user_age_kp),
4769 AKp::new(product_title_kp),
4770 AKp::new(product_price_kp),
4771 ];
4772
4773 let user_kps: Vec<_> = all_keypaths
4775 .iter()
4776 .filter(|akp| akp.root_type_id() == TypeId::of::<User>())
4777 .collect();
4778
4779 assert_eq!(user_kps.len(), 2);
4780
4781 let product_kps: Vec<_> = all_keypaths
4783 .iter()
4784 .filter(|akp| akp.root_type_id() == TypeId::of::<Product>())
4785 .collect();
4786
4787 assert_eq!(product_kps.len(), 2);
4788
4789 let string_value_kps: Vec<_> = all_keypaths
4791 .iter()
4792 .filter(|akp| akp.value_type_id() == TypeId::of::<String>())
4793 .collect();
4794
4795 assert_eq!(string_value_kps.len(), 2);
4796
4797 let user_string_kps: Vec<_> = all_keypaths
4799 .iter()
4800 .filter(|akp| {
4801 akp.root_type_id() == TypeId::of::<User>()
4802 && akp.value_type_id() == TypeId::of::<String>()
4803 })
4804 .collect();
4805
4806 assert_eq!(user_string_kps.len(), 1);
4807 assert_eq!(
4808 user_string_kps[0].get_as::<User, String>(&user),
4809 Some(Some(&"Eve".to_string()))
4810 );
4811
4812 let product_f64_kps: Vec<_> = all_keypaths
4814 .iter()
4815 .filter(|akp| {
4816 akp.root_type_id() == TypeId::of::<Product>()
4817 && akp.value_type_id() == TypeId::of::<f64>()
4818 })
4819 .collect();
4820
4821 assert_eq!(product_f64_kps.len(), 1);
4822 assert_eq!(
4823 product_f64_kps[0].get_as::<Product, f64>(&product),
4824 Some(Some(&19.99))
4825 );
4826 }
4827
4828 #[test]
4829 fn test_akp_filter_by_arc_root_type() {
4830 use std::any::TypeId;
4831 use std::sync::Arc;
4832
4833 #[derive(Debug)]
4834 struct User {
4835 name: String,
4836 }
4837
4838 #[derive(Debug)]
4839 struct Product {
4840 title: String,
4841 }
4842
4843 let user = User {
4844 name: "Frank".to_string(),
4845 };
4846 let product = Product {
4847 title: "Laptop".to_string(),
4848 };
4849
4850 let user_name_kp = KpType::new(|u: &User| Some(&u.name), |u: &mut User| Some(&mut u.name));
4852 let product_title_kp = KpType::new(
4853 |p: &Product| Some(&p.title),
4854 |p: &mut Product| Some(&mut p.title),
4855 );
4856
4857 let user_akp = AKp::new(user_name_kp).for_arc::<User>();
4859 let product_akp = AKp::new(product_title_kp).for_arc::<Product>();
4860
4861 let all_keypaths: Vec<AKp> = vec![user_akp, product_akp];
4862
4863 let arc_user_kps: Vec<_> = all_keypaths
4865 .iter()
4866 .filter(|akp| akp.root_type_id() == TypeId::of::<Arc<User>>())
4867 .collect();
4868
4869 assert_eq!(arc_user_kps.len(), 1);
4870
4871 let arc_user = Arc::new(user);
4873 assert_eq!(
4874 arc_user_kps[0].get_as::<Arc<User>, String>(&arc_user),
4875 Some(Some(&"Frank".to_string()))
4876 );
4877
4878 let arc_product_kps: Vec<_> = all_keypaths
4880 .iter()
4881 .filter(|akp| akp.root_type_id() == TypeId::of::<Arc<Product>>())
4882 .collect();
4883
4884 assert_eq!(arc_product_kps.len(), 1);
4885
4886 let arc_product = Arc::new(product);
4888 assert_eq!(
4889 arc_product_kps[0].get_as::<Arc<Product>, String>(&arc_product),
4890 Some(Some(&"Laptop".to_string()))
4891 );
4892 }
4893
4894 #[test]
4895 fn test_akp_filter_by_box_root_type() {
4896 use std::any::TypeId;
4897
4898 #[derive(Debug)]
4899 struct Config {
4900 setting: String,
4901 }
4902
4903 let config = Config {
4904 setting: "enabled".to_string(),
4905 };
4906
4907 let config_kp1 = KpType::new(
4909 |c: &Config| Some(&c.setting),
4910 |c: &mut Config| Some(&mut c.setting),
4911 );
4912 let config_kp2 = KpType::new(
4913 |c: &Config| Some(&c.setting),
4914 |c: &mut Config| Some(&mut c.setting),
4915 );
4916
4917 let regular_akp = AKp::new(config_kp1);
4919 let box_akp = AKp::new(config_kp2).for_box::<Config>();
4920
4921 let all_keypaths: Vec<AKp> = vec![regular_akp, box_akp];
4922
4923 let config_kps: Vec<_> = all_keypaths
4925 .iter()
4926 .filter(|akp| akp.root_type_id() == TypeId::of::<Config>())
4927 .collect();
4928
4929 assert_eq!(config_kps.len(), 1);
4930 assert_eq!(
4931 config_kps[0].get_as::<Config, String>(&config),
4932 Some(Some(&"enabled".to_string()))
4933 );
4934
4935 let box_config_kps: Vec<_> = all_keypaths
4937 .iter()
4938 .filter(|akp| akp.root_type_id() == TypeId::of::<Box<Config>>())
4939 .collect();
4940
4941 assert_eq!(box_config_kps.len(), 1);
4942
4943 let box_config = Box::new(Config {
4945 setting: "enabled".to_string(),
4946 });
4947 assert_eq!(
4948 box_config_kps[0].get_as::<Box<Config>, String>(&box_config),
4949 Some(Some(&"enabled".to_string()))
4950 );
4951 }
4952
4953 #[test]
4954 fn test_mixed_collection_type_filtering() {
4955 use std::any::TypeId;
4956 use std::sync::Arc;
4957
4958 #[derive(Debug)]
4959 struct User {
4960 name: String,
4961 email: String,
4962 }
4963
4964 #[derive(Debug)]
4965 struct Product {
4966 title: String,
4967 sku: String,
4968 }
4969
4970 let user = User {
4971 name: "Grace".to_string(),
4972 email: "grace@example.com".to_string(),
4973 };
4974
4975 let product = Product {
4976 title: "Widget".to_string(),
4977 sku: "WID-001".to_string(),
4978 };
4979
4980 let user_name_kp1 = KpType::new(|u: &User| Some(&u.name), |u: &mut User| Some(&mut u.name));
4982 let user_name_kp2 = KpType::new(|u: &User| Some(&u.name), |u: &mut User| Some(&mut u.name));
4983 let user_email_kp1 =
4984 KpType::new(|u: &User| Some(&u.email), |u: &mut User| Some(&mut u.email));
4985 let user_email_kp2 =
4986 KpType::new(|u: &User| Some(&u.email), |u: &mut User| Some(&mut u.email));
4987 let product_title_kp = KpType::new(
4988 |p: &Product| Some(&p.title),
4989 |p: &mut Product| Some(&mut p.title),
4990 );
4991 let product_sku_kp = KpType::new(
4992 |p: &Product| Some(&p.sku),
4993 |p: &mut Product| Some(&mut p.sku),
4994 );
4995
4996 let all_keypaths: Vec<AKp> = vec![
4997 AKp::new(user_name_kp1),
4998 AKp::new(user_email_kp1),
4999 AKp::new(product_title_kp),
5000 AKp::new(product_sku_kp),
5001 AKp::new(user_name_kp2).for_arc::<User>(),
5002 AKp::new(user_email_kp2).for_box::<User>(),
5003 ];
5004
5005 let string_value_kps: Vec<_> = all_keypaths
5007 .iter()
5008 .filter(|akp| akp.value_type_id() == TypeId::of::<String>())
5009 .collect();
5010
5011 assert_eq!(string_value_kps.len(), 6); let user_root_kps: Vec<_> = all_keypaths
5015 .iter()
5016 .filter(|akp| akp.root_type_id() == TypeId::of::<User>())
5017 .collect();
5018
5019 assert_eq!(user_root_kps.len(), 2);
5020
5021 let arc_user_kps: Vec<_> = all_keypaths
5023 .iter()
5024 .filter(|akp| akp.root_type_id() == TypeId::of::<Arc<User>>())
5025 .collect();
5026
5027 assert_eq!(arc_user_kps.len(), 1);
5028
5029 let box_user_kps: Vec<_> = all_keypaths
5031 .iter()
5032 .filter(|akp| akp.root_type_id() == TypeId::of::<Box<User>>())
5033 .collect();
5034
5035 assert_eq!(box_user_kps.len(), 1);
5036
5037 let product_kps: Vec<_> = all_keypaths
5039 .iter()
5040 .filter(|akp| akp.root_type_id() == TypeId::of::<Product>())
5041 .collect();
5042
5043 assert_eq!(product_kps.len(), 2);
5044
5045 let user_value = user_root_kps[0].get_as::<User, String>(&user);
5047 assert!(user_value.is_some());
5048 assert!(user_value.unwrap().is_some());
5049 }
5050
5051 #[test]
5056 fn test_kp_with_pin() {
5057 use std::pin::Pin;
5058
5059 #[derive(Debug)]
5063 struct SelfReferential {
5064 value: String,
5065 ptr_to_value: *const String, }
5067
5068 impl SelfReferential {
5069 fn new(s: String) -> Self {
5070 let mut sr = Self {
5071 value: s,
5072 ptr_to_value: std::ptr::null(),
5073 };
5074 sr.ptr_to_value = &sr.value as *const String;
5076 sr
5077 }
5078
5079 fn get_value(&self) -> &str {
5080 &self.value
5081 }
5082 }
5083
5084 let boxed = Box::new(SelfReferential::new("pinned_data".to_string()));
5086 let pinned: Pin<Box<SelfReferential>> = Box::into_pin(boxed);
5087
5088 let kp: KpType<Pin<Box<SelfReferential>>, String> = Kp::new(
5090 |p: &Pin<Box<SelfReferential>>| {
5091 Some(&p.as_ref().get_ref().value)
5093 },
5094 |p: &mut Pin<Box<SelfReferential>>| {
5095 unsafe {
5098 let sr = Pin::get_unchecked_mut(p.as_mut());
5099 Some(&mut sr.value)
5100 }
5101 },
5102 );
5103
5104 let result = kp.get(&pinned);
5106 assert_eq!(result, Some(&"pinned_data".to_string()));
5107
5108 assert_eq!(pinned.get_value(), "pinned_data");
5110 }
5111
5112 #[test]
5113 fn test_kp_with_pin_arc() {
5114 use std::pin::Pin;
5115 use std::sync::Arc;
5116
5117 struct AsyncState {
5118 status: String,
5119 data: Vec<i32>,
5120 }
5121
5122 let state = AsyncState {
5124 status: "ready".to_string(),
5125 data: vec![1, 2, 3, 4, 5],
5126 };
5127
5128 let pinned_arc: Pin<Arc<AsyncState>> = Arc::pin(state);
5129
5130 let status_kp: KpType<Pin<Arc<AsyncState>>, String> = Kp::new(
5132 |p: &Pin<Arc<AsyncState>>| Some(&p.as_ref().get_ref().status),
5133 |_: &mut Pin<Arc<AsyncState>>| {
5134 None::<&mut String>
5136 },
5137 );
5138
5139 let data_kp: KpType<Pin<Arc<AsyncState>>, Vec<i32>> = Kp::new(
5141 |p: &Pin<Arc<AsyncState>>| Some(&p.as_ref().get_ref().data),
5142 |_: &mut Pin<Arc<AsyncState>>| None::<&mut Vec<i32>>,
5143 );
5144
5145 let status = status_kp.get(&pinned_arc);
5146 assert_eq!(status, Some(&"ready".to_string()));
5147
5148 let data = data_kp.get(&pinned_arc);
5149 assert_eq!(data, Some(&vec![1, 2, 3, 4, 5]));
5150 }
5151
5152 #[test]
5153 fn test_kp_with_maybe_uninit() {
5154 use std::mem::MaybeUninit;
5155
5156 struct Config {
5160 name: MaybeUninit<String>,
5161 value: MaybeUninit<i32>,
5162 initialized: bool,
5163 }
5164
5165 impl Config {
5166 fn new_uninit() -> Self {
5167 Self {
5168 name: MaybeUninit::uninit(),
5169 value: MaybeUninit::uninit(),
5170 initialized: false,
5171 }
5172 }
5173
5174 fn init(&mut self, name: String, value: i32) {
5175 self.name.write(name);
5176 self.value.write(value);
5177 self.initialized = true;
5178 }
5179
5180 fn get_name(&self) -> Option<&String> {
5181 if self.initialized {
5182 unsafe { Some(self.name.assume_init_ref()) }
5183 } else {
5184 None
5185 }
5186 }
5187
5188 fn get_value(&self) -> Option<&i32> {
5189 if self.initialized {
5190 unsafe { Some(self.value.assume_init_ref()) }
5191 } else {
5192 None
5193 }
5194 }
5195 }
5196
5197 let name_kp: KpType<Config, String> = Kp::new(
5199 |c: &Config| c.get_name(),
5200 |c: &mut Config| {
5201 if c.initialized {
5202 unsafe { Some(c.name.assume_init_mut()) }
5203 } else {
5204 None
5205 }
5206 },
5207 );
5208
5209 let value_kp: KpType<Config, i32> = Kp::new(
5210 |c: &Config| c.get_value(),
5211 |c: &mut Config| {
5212 if c.initialized {
5213 unsafe { Some(c.value.assume_init_mut()) }
5214 } else {
5215 None
5216 }
5217 },
5218 );
5219
5220 let uninit_config = Config::new_uninit();
5222 assert_eq!(name_kp.get(&uninit_config), None);
5223 assert_eq!(value_kp.get(&uninit_config), None);
5224
5225 let mut init_config = Config::new_uninit();
5227 init_config.init("test_config".to_string(), 42);
5228
5229 assert_eq!(name_kp.get(&init_config), Some(&"test_config".to_string()));
5230 assert_eq!(value_kp.get(&init_config), Some(&42));
5231
5232 if let Some(val) = value_kp.get_mut(&mut init_config) {
5234 *val = 100;
5235 }
5236
5237 assert_eq!(value_kp.get(&init_config), Some(&100));
5238 }
5239
5240 #[test]
5241 fn test_kp_with_weak() {
5242 use std::sync::{Arc, Weak};
5243
5244 #[derive(Debug, Clone)]
5248 struct Node {
5249 value: i32,
5250 }
5251
5252 struct NodeWithParent {
5253 value: i32,
5254 parent: Option<Arc<Node>>, }
5256
5257 let parent = Arc::new(Node { value: 100 });
5258
5259 let child = NodeWithParent {
5260 value: 42,
5261 parent: Some(parent.clone()),
5262 };
5263
5264 let parent_value_kp: KpType<NodeWithParent, i32> = Kp::new(
5266 |n: &NodeWithParent| n.parent.as_ref().map(|arc| &arc.value),
5267 |_: &mut NodeWithParent| None::<&mut i32>,
5268 );
5269
5270 let parent_val = parent_value_kp.get(&child);
5272 assert_eq!(parent_val, Some(&100));
5273 }
5274
5275 #[test]
5276 fn test_kp_with_rc_weak() {
5277 use std::rc::Rc;
5278
5279 struct TreeNode {
5282 value: String,
5283 parent: Option<Rc<TreeNode>>, }
5285
5286 let root = Rc::new(TreeNode {
5287 value: "root".to_string(),
5288 parent: None,
5289 });
5290
5291 let child1 = TreeNode {
5292 value: "child1".to_string(),
5293 parent: Some(root.clone()),
5294 };
5295
5296 let child2 = TreeNode {
5297 value: "child2".to_string(),
5298 parent: Some(root.clone()),
5299 };
5300
5301 let parent_name_kp: KpType<TreeNode, String> = Kp::new(
5303 |node: &TreeNode| node.parent.as_ref().map(|rc| &rc.value),
5304 |_: &mut TreeNode| None::<&mut String>,
5305 );
5306
5307 assert_eq!(parent_name_kp.get(&child1), Some(&"root".to_string()));
5309 assert_eq!(parent_name_kp.get(&child2), Some(&"root".to_string()));
5310
5311 assert_eq!(parent_name_kp.get(&root), None);
5313 }
5314
5315 #[test]
5316 fn test_kp_with_complex_weak_structure() {
5317 use std::sync::Arc;
5318
5319 struct Cache {
5322 data: String,
5323 backup: Option<Arc<Cache>>, }
5325
5326 let primary = Arc::new(Cache {
5327 data: "primary_data".to_string(),
5328 backup: None,
5329 });
5330
5331 let backup = Arc::new(Cache {
5332 data: "backup_data".to_string(),
5333 backup: Some(primary.clone()),
5334 });
5335
5336 let backup_data_kp: KpType<Arc<Cache>, String> = Kp::new(
5338 |cache_arc: &Arc<Cache>| cache_arc.backup.as_ref().map(|arc| &arc.data),
5339 |_: &mut Arc<Cache>| None::<&mut String>,
5340 );
5341
5342 let data = backup_data_kp.get(&backup);
5344 assert_eq!(data, Some(&"primary_data".to_string()));
5345
5346 let no_backup = backup_data_kp.get(&primary);
5348 assert_eq!(no_backup, None);
5349 }
5350
5351 #[test]
5352 fn test_kp_chain_with_pin_and_arc() {
5353 use std::pin::Pin;
5354 use std::sync::Arc;
5355
5356 struct Outer {
5359 inner: Arc<Inner>,
5360 }
5361
5362 struct Inner {
5363 value: String,
5364 }
5365
5366 let outer = Outer {
5367 inner: Arc::new(Inner {
5368 value: "nested_value".to_string(),
5369 }),
5370 };
5371
5372 let pinned_outer = Box::pin(outer);
5373
5374 let to_inner: KpType<Pin<Box<Outer>>, Arc<Inner>> = Kp::new(
5376 |p: &Pin<Box<Outer>>| Some(&p.as_ref().get_ref().inner),
5377 |_: &mut Pin<Box<Outer>>| None::<&mut Arc<Inner>>,
5378 );
5379
5380 let to_value: KpType<Arc<Inner>, String> = Kp::new(
5382 |a: &Arc<Inner>| Some(&a.value),
5383 |_: &mut Arc<Inner>| None::<&mut String>,
5384 );
5385
5386 let chained = to_inner.then(to_value);
5388
5389 let result = chained.get(&pinned_outer);
5390 assert_eq!(result, Some(&"nested_value".to_string()));
5391 }
5392
5393 #[test]
5394 fn test_kp_with_maybe_uninit_array() {
5395 use std::mem::MaybeUninit;
5396
5397 struct Buffer {
5401 data: [MaybeUninit<u8>; 10],
5402 len: usize,
5403 }
5404
5405 impl Buffer {
5406 fn new() -> Self {
5407 Self {
5408 data: unsafe { MaybeUninit::uninit().assume_init() },
5409 len: 0,
5410 }
5411 }
5412
5413 fn push(&mut self, byte: u8) -> Result<(), &'static str> {
5414 if self.len >= self.data.len() {
5415 return Err("Buffer full");
5416 }
5417 self.data[self.len].write(byte);
5418 self.len += 1;
5419 Ok(())
5420 }
5421
5422 fn get(&self, idx: usize) -> Option<&u8> {
5423 if idx < self.len {
5424 unsafe { Some(self.data[idx].assume_init_ref()) }
5425 } else {
5426 None
5427 }
5428 }
5429
5430 fn get_mut(&mut self, idx: usize) -> Option<&mut u8> {
5431 if idx < self.len {
5432 unsafe { Some(self.data[idx].assume_init_mut()) }
5433 } else {
5434 None
5435 }
5436 }
5437 }
5438
5439 let len_kp: KpType<Buffer, usize> =
5441 Kp::new(|b: &Buffer| Some(&b.len), |b: &mut Buffer| Some(&mut b.len));
5442
5443 let mut buffer = Buffer::new();
5444
5445 assert_eq!(len_kp.get(&buffer), Some(&0));
5447
5448 buffer.push(1).unwrap();
5450 buffer.push(2).unwrap();
5451 buffer.push(3).unwrap();
5452
5453 assert_eq!(len_kp.get(&buffer), Some(&3));
5455
5456 assert_eq!(buffer.get(0), Some(&1));
5458 assert_eq!(buffer.get(1), Some(&2));
5459 assert_eq!(buffer.get(2), Some(&3));
5460 assert_eq!(buffer.get(10), None); if let Some(elem) = buffer.get_mut(1) {
5464 *elem = 20;
5465 }
5466 assert_eq!(buffer.get(1), Some(&20));
5467 }
5468
5469 #[test]
5470 fn test_kp_then_lock_deep_structs() {
5471 use std::sync::{Arc, Mutex};
5472
5473 #[derive(Clone)]
5474 struct Root {
5475 guard: Arc<Mutex<Level1>>,
5476 }
5477 #[derive(Clone)]
5478 struct Level1 {
5479 name: String,
5480 nested: Level2,
5481 }
5482 #[derive(Clone)]
5483 struct Level2 {
5484 count: i32,
5485 }
5486
5487 let root = Root {
5488 guard: Arc::new(Mutex::new(Level1 {
5489 name: "deep".to_string(),
5490 nested: Level2 { count: 42 },
5491 })),
5492 };
5493
5494 let kp_to_guard: KpType<Root, Arc<Mutex<Level1>>> =
5495 Kp::new(|r: &Root| Some(&r.guard), |r: &mut Root| Some(&mut r.guard));
5496
5497 let lock_kp = {
5498 let prev: KpType<Arc<Mutex<Level1>>, Arc<Mutex<Level1>>> = Kp::new(
5499 |g: &Arc<Mutex<Level1>>| Some(g),
5500 |g: &mut Arc<Mutex<Level1>>| Some(g),
5501 );
5502 let next: KpType<Level1, Level1> =
5503 Kp::new(|l: &Level1| Some(l), |l: &mut Level1| Some(l));
5504 crate::lock::LockKp::new(prev, crate::lock::ArcMutexAccess::new(), next)
5505 };
5506
5507 let chained = kp_to_guard.then_lock(lock_kp);
5508 let level1 = chained.get(&root);
5509 assert!(level1.is_some());
5510 assert_eq!(level1.unwrap().name, "deep");
5511 assert_eq!(level1.unwrap().nested.count, 42);
5512
5513 let mut_root = &mut root.clone();
5514 let mut_level1 = chained.get_mut(mut_root);
5515 assert!(mut_level1.is_some());
5516 mut_level1.unwrap().nested.count = 99;
5517 assert_eq!(chained.get(&root).unwrap().nested.count, 99);
5518 }
5519
5520 #[test]
5521 fn test_kp_then_lock_with_enum() {
5522 use std::sync::{Arc, Mutex};
5523
5524 #[derive(Clone)]
5525 enum Message {
5526 Request(LevelA),
5527 Response(i32),
5528 }
5529 #[derive(Clone)]
5530 struct LevelA {
5531 data: Arc<Mutex<i32>>,
5532 }
5533
5534 struct RootWithEnum {
5535 msg: Arc<Mutex<Message>>,
5536 }
5537
5538 let root = RootWithEnum {
5539 msg: Arc::new(Mutex::new(Message::Request(LevelA {
5540 data: Arc::new(Mutex::new(100)),
5541 }))),
5542 };
5543
5544 let kp_msg: KpType<RootWithEnum, Arc<Mutex<Message>>> = Kp::new(
5545 |r: &RootWithEnum| Some(&r.msg),
5546 |r: &mut RootWithEnum| Some(&mut r.msg),
5547 );
5548
5549 let lock_kp_msg = {
5550 let prev: KpType<Arc<Mutex<Message>>, Arc<Mutex<Message>>> = Kp::new(
5551 |m: &Arc<Mutex<Message>>| Some(m),
5552 |m: &mut Arc<Mutex<Message>>| Some(m),
5553 );
5554 let next: KpType<Message, Message> =
5555 Kp::new(|m: &Message| Some(m), |m: &mut Message| Some(m));
5556 crate::lock::LockKp::new(prev, crate::lock::ArcMutexAccess::new(), next)
5557 };
5558
5559 let chained = kp_msg.then_lock(lock_kp_msg);
5560 let msg = chained.get(&root);
5561 assert!(msg.is_some());
5562 match msg.unwrap() {
5563 Message::Request(a) => assert_eq!(*a.data.lock().unwrap(), 100),
5564 Message::Response(_) => panic!("expected Request"),
5565 }
5566 }
5567
5568 #[cfg(all(feature = "tokio", feature = "parking_lot"))]
5569 #[tokio::test]
5570 async fn test_kp_then_async_deep_chain() {
5571 use crate::async_lock::{AsyncLockKp, TokioMutexAccess};
5572 use std::sync::Arc;
5573
5574 #[derive(Clone)]
5575 struct Root {
5576 tokio_guard: Arc<tokio::sync::Mutex<Level1>>,
5577 }
5578 #[derive(Clone)]
5579 struct Level1 {
5580 value: i32,
5581 }
5582
5583 let root = Root {
5584 tokio_guard: Arc::new(tokio::sync::Mutex::new(Level1 { value: 7 })),
5585 };
5586
5587 let kp_to_guard: KpType<Root, Arc<tokio::sync::Mutex<Level1>>> = Kp::new(
5588 |r: &Root| Some(&r.tokio_guard),
5589 |r: &mut Root| Some(&mut r.tokio_guard),
5590 );
5591
5592 let async_kp = {
5593 let prev: KpType<Arc<tokio::sync::Mutex<Level1>>, Arc<tokio::sync::Mutex<Level1>>> =
5594 Kp::new(
5595 |g: &Arc<tokio::sync::Mutex<Level1>>| Some(g),
5596 |g: &mut Arc<tokio::sync::Mutex<Level1>>| Some(g),
5597 );
5598 let next: KpType<Level1, Level1> =
5599 Kp::new(|l: &Level1| Some(l), |l: &mut Level1| Some(l));
5600 AsyncLockKp::new(prev, TokioMutexAccess::new(), next)
5601 };
5602
5603 let chained = kp_to_guard.then_async(async_kp);
5604 let level1 = chained.get(&root).await;
5605 assert!(level1.is_some());
5606 assert_eq!(level1.unwrap().value, 7);
5607 }
5608
5609 #[cfg(all(feature = "tokio", feature = "parking_lot"))]
5612 #[tokio::test]
5613 async fn test_deep_nested_chain_kp_lock_async_lock_kp() {
5614 use crate::async_lock::{AsyncLockKp, TokioMutexAccess};
5615 use crate::lock::{ArcMutexAccess, LockKp};
5616 use std::sync::{Arc, Mutex};
5617
5618 #[derive(Clone)]
5620 struct Root {
5621 sync_mutex: Arc<Mutex<Level1>>,
5622 }
5623 #[derive(Clone)]
5625 struct Level1 {
5626 inner: Level2,
5627 }
5628 #[derive(Clone)]
5630 struct Level2 {
5631 tokio_mutex: Arc<tokio::sync::Mutex<Level3>>,
5632 }
5633 #[derive(Clone)]
5635 struct Level3 {
5636 leaf: i32,
5637 }
5638
5639 let mut root = Root {
5640 sync_mutex: Arc::new(Mutex::new(Level1 {
5641 inner: Level2 {
5642 tokio_mutex: Arc::new(tokio::sync::Mutex::new(Level3 { leaf: 42 })),
5643 },
5644 })),
5645 };
5646
5647 let identity_l1: KpType<Level1, Level1> =
5649 Kp::new(|l: &Level1| Some(l), |l: &mut Level1| Some(l));
5650 let kp_sync: KpType<Root, Arc<Mutex<Level1>>> = Kp::new(
5651 |r: &Root| Some(&r.sync_mutex),
5652 |r: &mut Root| Some(&mut r.sync_mutex),
5653 );
5654 let lock_root_to_l1 = LockKp::new(kp_sync, ArcMutexAccess::new(), identity_l1);
5655
5656 let kp_l1_inner: KpType<Level1, Level2> = Kp::new(
5658 |l: &Level1| Some(&l.inner),
5659 |l: &mut Level1| Some(&mut l.inner),
5660 );
5661
5662 let kp_l2_tokio: KpType<Level2, Arc<tokio::sync::Mutex<Level3>>> = Kp::new(
5664 |l: &Level2| Some(&l.tokio_mutex),
5665 |l: &mut Level2| Some(&mut l.tokio_mutex),
5666 );
5667
5668 let async_l3 = {
5670 let prev: KpType<Arc<tokio::sync::Mutex<Level3>>, Arc<tokio::sync::Mutex<Level3>>> =
5671 Kp::new(|t: &_| Some(t), |t: &mut _| Some(t));
5672 let next: KpType<Level3, Level3> =
5673 Kp::new(|l: &Level3| Some(l), |l: &mut Level3| Some(l));
5674 AsyncLockKp::new(prev, TokioMutexAccess::new(), next)
5675 };
5676
5677 let kp_l3_leaf: KpType<Level3, i32> = Kp::new(
5679 |l: &Level3| Some(&l.leaf),
5680 |l: &mut Level3| Some(&mut l.leaf),
5681 );
5682
5683 let step1 = lock_root_to_l1.then(kp_l1_inner);
5685 let step2 = step1.then(kp_l2_tokio);
5686 let step3 = step2.then_async(async_l3);
5687 let deep_chain = step3.then(kp_l3_leaf);
5688
5689 let leaf = deep_chain.get(&root).await;
5691 deep_chain.get_mut(&mut root).await.map(|l| *l = 100);
5692 assert_eq!(leaf, Some(&100));
5693
5694 let mut root_mut = root.clone();
5696 let leaf_mut = deep_chain.get_mut(&mut root_mut).await;
5697 assert!(leaf_mut.is_some());
5698 *leaf_mut.unwrap() = 99;
5699
5700 let leaf_after = deep_chain.get(&root_mut).await;
5702 assert_eq!(leaf_after, Some(&99));
5703 }
5704}