deep_causality_haft/alias/alias_monad.rs
1/*
2 * SPDX-License-Identifier: MIT
3 * Copyright (c) 2023 - 2026. The DeepCausality Authors and Contributors. All Rights Reserved.
4 */
5
6use crate::{HKT, Monad, Satisfies};
7
8/// Alias trait for `Monad` providing more intuitive method names.
9///
10/// - `chain` → `bind`: Chains a computation, flattening nested containers.
11/// - `flatten` → `join`: Flattens a nested container.
12pub trait AliasMonad<F: HKT>: Monad<F> {
13 /// Alias for `bind`. Chains a computation, flattening the result.
14 #[inline]
15 fn chain<A, B, Func>(m_a: F::Type<A>, f: Func) -> F::Type<B>
16 where
17 A: Satisfies<F::Constraint>,
18 B: Satisfies<F::Constraint>,
19 Func: FnMut(A) -> F::Type<B>,
20 {
21 Self::bind(m_a, f)
22 }
23
24 /// Alias for `join`. Flattens a nested container.
25 #[inline]
26 fn flatten<A>(m_m_a: F::Type<F::Type<A>>) -> F::Type<A>
27 where
28 A: Satisfies<F::Constraint>,
29 F::Type<A>: Satisfies<F::Constraint>,
30 {
31 Self::join(m_m_a)
32 }
33}
34
35// Blanket implementation
36impl<T, F> AliasMonad<F> for T
37where
38 T: Monad<F>,
39 F: HKT,
40{
41}