//@NO-IMPLICIT-PRELUDE
//! Implementation of the `Applicative` type
/// `Semigroup a` represents an associative operation on `a`.
/// This means the following laws must hold:
///
/// * `forall x . append x (append y z) == append (append x y) z`
#[implicit]
type Semigroup a = {
/// # Note
///
/// * Known as `(<>)` or `mappend` in Haskell
append : a -> a -> a
}
let append ?s : [Semigroup a] -> a -> a -> a = s.append
#[infix(left, 4)]
let (<>) : [Semigroup a] -> a -> a -> a = append
{
Semigroup,
append,
(<>),
}