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    // Profunctor
41    pub use karpal_profunctor::{Choice, FnP, Profunctor, Strong};
42
43    // Optics
44    pub use karpal_optics::lens::ComposedLens;
45    pub use karpal_optics::lens::{Lens, SimpleLens};
46    pub use karpal_optics::optic::Optic;
47    pub use karpal_optics::{Prism, SimplePrism};
48
49    // Arrow hierarchy
50    pub use karpal_arrow::{
51        Arrow, ArrowApply, ArrowChoice, ArrowLoop, ArrowPlus, ArrowZero, Category, CokleisliF, FnA,
52        KleisliF, Semigroupoid,
53    };
54
55    // Arrow macros
56    pub use karpal_arrow::{impl_cokleisli, impl_cokleisli_env};
57
58    // Macros
59    pub use karpal_core::{ado_, do_};
60}
61
62// Crate re-exports for qualified access
63pub use karpal_arrow;
64pub use karpal_core;
65pub use karpal_optics;
66pub use karpal_profunctor;
67
68// Macro re-exports
69pub use karpal_core::ado_;
70pub use karpal_core::do_;
71
72#[cfg(test)]
73mod tests {
74    use super::prelude::*;
75
76    #[test]
77    fn prelude_hkt_accessible() {
78        let _: <OptionF as HKT>::Of<i32> = Some(42);
79        let _: <VecF as HKT>::Of<i32> = vec![1, 2, 3];
80        let _: <ResultF<String> as HKT>::Of<i32> = Ok(42);
81    }
82
83    #[test]
84    fn prelude_functor_accessible() {
85        let result = <OptionF as Functor>::fmap(Some(1), |x| x + 1);
86        assert_eq!(result, Some(2));
87    }
88
89    #[test]
90    fn prelude_lens_accessible() {
91        let lens: SimpleLens<(i32, i32), i32> = Lens::new(|p: &(i32, i32)| p.0, |p, x| (x, p.1));
92        assert_eq!(lens.get(&(1, 2)), 1);
93    }
94
95    #[test]
96    fn prelude_prism_accessible() {
97        let prism: SimplePrism<Option<i32>, i32> = Prism::new(
98            |s| match s {
99                Some(v) => Ok(v),
100                None => Err(None),
101            },
102            Some,
103        );
104        assert_eq!(prism.preview(&Some(42)), Some(42));
105        assert_eq!(prism.preview(&None), None);
106    }
107
108    #[test]
109    fn prelude_profunctor_accessible() {
110        let f: <FnP as HKT2>::P<i32, i32> = Box::new(|x| x + 1);
111        assert_eq!(f(1), 2);
112    }
113
114    #[test]
115    fn prelude_arrow_accessible() {
116        let double = <FnA as Arrow>::arr(|x: i32| x * 2);
117        let inc = <FnA as Arrow>::arr(|x: i32| x + 1);
118        let composed = <FnA as Semigroupoid>::compose(inc, double);
119        assert_eq!(composed(5), 11); // (5 * 2) + 1
120    }
121}