Skip to main content

karpal_std/
lib.rs

1// Standard prelude for the Karpal ecosystem.
2//
3// Re-exports the most commonly used types and traits from
4// `karpal-core`, `karpal-profunctor`, and `karpal-optics`.
5
6/// Prelude module — `use karpal_std::prelude::*` to import everything.
7pub mod prelude {
8    // HKT encoding
9    pub use karpal_core::hkt::{
10        EnvF, HKT, HKT2, IdentityF, NonEmptyVec, NonEmptyVecF, OptionF, ResultBF, ResultF, StoreF,
11        TracedF, TupleF, VecF,
12    };
13
14    // Functor hierarchy
15    pub use karpal_core::{
16        Alt, Alternative, Applicative, Apply, Chain, Functor, FunctorFilter, Monad,
17    };
18
19    // Foldable / Traversable
20    pub use karpal_core::{Foldable, Traversable};
21
22    // Comonad hierarchy
23    pub use karpal_core::{Comonad, ComonadEnv, ComonadStore, ComonadTraced, Extend};
24
25    // Bifunctor, Selective, NaturalTransformation
26    pub use karpal_core::{Bifunctor, NaturalTransformation, Selective};
27
28    // Invariant
29    pub use karpal_core::Invariant;
30
31    // Contravariant hierarchy
32    pub use karpal_core::{Conclude, Contravariant, Decide, Divide, Divisible, PredicateF};
33
34    // Plus
35    pub use karpal_core::Plus;
36
37    // Algebraic typeclasses
38    pub use karpal_core::{Monoid, Semigroup};
39
40    // Newtype wrappers
41    pub use karpal_core::{First, Last, Max, Min, Product, Sum};
42
43    // Abstract algebra
44    pub use karpal_algebra::{
45        AbelianGroup, BoundedLattice, Field, Group, Lattice, Module, Ring, Semiring, VectorSpace,
46    };
47
48    // Profunctor
49    pub use karpal_profunctor::{Choice, FnP, ForgetF, Profunctor, Strong, TaggedF, Traversing};
50
51    // Optics
52    pub use karpal_optics::fold::{ComposedFold, Fold};
53    pub use karpal_optics::getter::{ComposedGetter, Getter};
54    pub use karpal_optics::iso::{Iso, SimpleIso};
55    pub use karpal_optics::lens::{ComposedLens, Lens, SimpleLens};
56    pub use karpal_optics::optic::Optic;
57    pub use karpal_optics::review::Review;
58    pub use karpal_optics::setter::{Setter, SimpleSetter};
59    pub use karpal_optics::traversal::{ComposedTraversal, SimpleTraversal, Traversal};
60    pub use karpal_optics::{Prism, SimplePrism};
61
62    // Arrow hierarchy
63    pub use karpal_arrow::{
64        Arrow, ArrowApply, ArrowChoice, ArrowLoop, ArrowPlus, ArrowZero, Category, CokleisliF, FnA,
65        KleisliF, Semigroupoid,
66    };
67
68    // Arrow macros
69    pub use karpal_arrow::{impl_cokleisli, impl_cokleisli_env};
70
71    // Free constructions
72    pub use karpal_free::{
73        Codensity, CodensityF, Cofree, CofreeF, Coyoneda, CoyonedaF, Day, DayF, Density, DensityF,
74        Free, FreeAlt, FreeAltF, FreeAp, FreeApF, FreeF, Freer, FreerF, Lan, LanF, Ran, RanMapped,
75        Yoneda, YonedaF,
76    };
77
78    // Recursion schemes
79    pub use karpal_recursion::{
80        Either, Fix, FixF, Mu, Nu, ana, apo, cata, chrono, futu, histo, hylo, para, zygo,
81    };
82
83    // Macros
84    pub use karpal_core::{ado_, do_};
85}
86
87// Crate re-exports for qualified access
88pub use karpal_algebra;
89pub use karpal_arrow;
90pub use karpal_core;
91pub use karpal_free;
92pub use karpal_optics;
93pub use karpal_profunctor;
94pub use karpal_recursion;
95
96// Macro re-exports
97pub use karpal_core::ado_;
98pub use karpal_core::do_;
99
100#[cfg(test)]
101mod tests {
102    use super::prelude::*;
103
104    #[test]
105    fn prelude_hkt_accessible() {
106        let _: <OptionF as HKT>::Of<i32> = Some(42);
107        let _: <VecF as HKT>::Of<i32> = vec![1, 2, 3];
108        let _: <ResultF<String> as HKT>::Of<i32> = Ok(42);
109    }
110
111    #[test]
112    fn prelude_functor_accessible() {
113        let result = <OptionF as Functor>::fmap(Some(1), |x| x + 1);
114        assert_eq!(result, Some(2));
115    }
116
117    #[test]
118    fn prelude_lens_accessible() {
119        let lens: SimpleLens<(i32, i32), i32> = Lens::new(|p: &(i32, i32)| p.0, |p, x| (x, p.1));
120        assert_eq!(lens.get(&(1, 2)), 1);
121    }
122
123    #[test]
124    fn prelude_prism_accessible() {
125        let prism: SimplePrism<Option<i32>, i32> = Prism::new(
126            |s| match s {
127                Some(v) => Ok(v),
128                None => Err(None),
129            },
130            Some,
131        );
132        assert_eq!(prism.preview(&Some(42)), Some(42));
133        assert_eq!(prism.preview(&None), None);
134    }
135
136    #[test]
137    fn prelude_profunctor_accessible() {
138        let f: <FnP as HKT2>::P<i32, i32> = Box::new(|x| x + 1);
139        assert_eq!(f(1), 2);
140    }
141
142    #[test]
143    fn prelude_arrow_accessible() {
144        let double = <FnA as Arrow>::arr(|x: i32| x * 2);
145        let inc = <FnA as Arrow>::arr(|x: i32| x + 1);
146        let composed = <FnA as Semigroupoid>::compose(inc, double);
147        assert_eq!(composed(5), 11); // (5 * 2) + 1
148    }
149}