# vim:tw=80:ft=pnlc:
# inc:../prelude.pnlc

# check whether a given `Monoid` instance obeys the monoid laws

..def \enum \eq .unsgrp \sappend
  # associativity
  ...equal ..fn:eq enum ..fn:eq enum ..fn:eq enum eq
    \x \y \z ..sappend x ..sappend y z
    \x \y \z ..sappend ..sappend x y z
\sgrpcheck

..def \enum \eq .unmnid \sgrp \mempty .sgrp \sappend
  ..and ...sgrpcheck enum eq sgrp
    # identity element
    ....psi and ..equal ..fn:eq enum eq id
      \x ..sappend x mempty
      \x ..sappend mempty x
\mnidcheck

.main
  ..putd bool:dbg
    # ...sgrpcheck bool:enum bool:eq or:sgrp
    # ...mnidcheck bool:enum bool:eq and:mnid
    # ...sgrpcheck cmp:enum cmp:eq tcons:sgrp
    ...mnidcheck cmp:enum cmp:eq telse:mnid
