{-# OPTIONS --cubical --safe #-}
module Algebra where

open import Prelude

module _ {โ„“} (๐‘† : Type โ„“) where
  record Magma : Type โ„“ where
    infixl 6 _โˆ™_
    field
      _โˆ™_    : ๐‘† โ†’ ๐‘† โ†’ ๐‘†

    infix 4 _โІ_
    _โІ_ : ๐‘† โ†’ ๐‘† โ†’ Type _
    x โІ y = โˆƒ z ร— y โ‰ก x โˆ™ z

  record UnitalMagma : Type โ„“ where
    infixl 6 _โˆ™_
    field
      _โˆ™_    : ๐‘† โ†’ ๐‘† โ†’ ๐‘†
      ฮต      : ๐‘†

    magma : Magma
    magma = record { _โˆ™_ = _โˆ™_ }

    open Magma magma using (_โІ_) public

  record  Semigroup : Type โ„“ where
    infixl 6 _โˆ™_
    field
      _โˆ™_    : ๐‘† โ†’ ๐‘† โ†’ ๐‘†
      assoc  : โˆ€ x y z โ†’ (x โˆ™ y) โˆ™ z โ‰ก x โˆ™ (y โˆ™ z)

    magma : Magma
    magma = record { _โˆ™_ = _โˆ™_ }

    open Magma magma using (_โІ_) public

    โІ-trans : โˆ€ x y z โ†’ x โІ y โ†’ y โІ z โ†’ x โІ z
    โІ-trans x y z xโІy yโІz .fst = xโІy .fst โˆ™ yโІz .fst
    โІ-trans x y z xโІy yโІz .snd = yโІz .snd โจพ cong (_โˆ™ _) (xโІy .snd) โจพ assoc x _ _

  record  Monoid : Type โ„“ where
    infixl 6 _โˆ™_
    field
      _โˆ™_    : ๐‘† โ†’ ๐‘† โ†’ ๐‘†
      ฮต      : ๐‘†
      assoc  : โˆ€ x y z โ†’ (x โˆ™ y) โˆ™ z โ‰ก x โˆ™ (y โˆ™ z)
      ฮตโˆ™     : โˆ€ x โ†’ ฮต โˆ™ x โ‰ก x
      โˆ™ฮต     : โˆ€ x โ†’ x โˆ™ ฮต โ‰ก x

    semigroup : Semigroup
    semigroup = record
      { _โˆ™_ = _โˆ™_; assoc = assoc }

    unitalMagma : UnitalMagma
    unitalMagma = record
      { _โˆ™_ = _โˆ™_; ฮต = ฮต }

    open Semigroup semigroup using (_โІ_; โІ-trans) public

    -- โІ-refl : โˆ€ x โ†’ x โІ x
    -- โІ-refl x .fst = ฮต
    -- โІ-refl x .snd = sym (โˆ™ฮต _)

  record CommutativeMonoid : Type โ„“ where
    field
      monoid : Monoid
    open Monoid monoid public
    field
      comm : โˆ€ x y โ†’ x โˆ™ y โ‰ก y โˆ™ x

  record Semilattice : Type โ„“ where
    field
      commutativeMonoid : CommutativeMonoid
    open CommutativeMonoid commutativeMonoid public
    field
      idem : โˆ€ x โ†’ x โˆ™ x โ‰ก x