gluon 0.13.1

A static, type inferred programming language for application embedding
Documentation
//@NO-IMPLICIT-PRELUDE
//! The boolean type.

let { Bool, Ordering } = import! std.types
let { Semigroup } = import! std.semigroup
let { Monoid } = import! std.monoid
let { Group } = import! std.group
let { Eq, Ord } = import! std.cmp
let { Show } = import! std.show
let { id } = import! std.function

/// Boolean 'not'
let not x : Bool -> Bool = if x then False else True

/// Boolean 'exclusive or'
let xor x y : Bool -> Bool -> Bool = if x then not y else y

let conjunctive =
    let semigroup : Semigroup Bool = {
        append = \x y -> x && y
    }

    let monoid : Monoid Bool = {
        semigroup = semigroup,
        empty = True,
    }

    { semigroup, monoid }

let disjunctive =
    let semigroup : Semigroup Bool = {
        append = \x y -> x || y
    }

    let monoid : Monoid Bool = {
        semigroup = semigroup,
        empty = False,
    }

    { semigroup, monoid }

let exclusive =
    let semigroup : Semigroup Bool = { append = xor }

    let monoid : Monoid Bool = {
        semigroup = semigroup,
        empty = False,
    }

    let group : Group Bool = {
        monoid = monoid,
        inverse = id,
    }

    { semigroup, monoid, group }

let eq : Eq Bool = {
    (==) = \l r -> if l then r else not r
}

let ord : Ord Bool = {
    eq = eq, compare = \l r -> if l then if r then EQ else GT else LT
}

let show : Show Bool = {
    show = \x -> if x then "True" else "False"
}

{
    Bool,
    not,
    xor,
    conjunctive,
    disjunctive,
    exclusive,
    eq,
    ord,
    show,
}