gluon 0.13.1

A static, type inferred programming language for application embedding
Documentation
//! Implementation of the `Writer` type

let { Functor, map } = import! std.functor
let prelude @ { Applicative, Monad, Monoid, (<>) } = import! std.prelude
let { empty } = import! std.monoid
let { Identity } = import! std.identity

/// The writer Monad
type Writer w a = { value : a, writer : w }

let functor : [Monoid w] -> Functor (Writer w) = {
    map = \f m -> { value = f m.value, writer = m.writer }
}

let applicative : [Monoid w] -> Applicative (Writer w) = {
    functor,
    apply = \mf m -> { value = mf.value m.value, writer = mf.writer <> m.writer },
    wrap = \value -> { value, writer = empty },
}

let monad : [Monoid w] -> Monad (Writer w) = {
    applicative,
    flat_map = \f m ->
        let { value, writer } = f m.value
        { value, writer = m.writer <> writer },
}

let tell w : w -> Writer w () = { value = (), writer = w }

{ Writer, functor, applicative, monad, tell }