Skip to main content

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}