package Ġarrow . type classes Ċ Ċ import Ġarrow . Kind Ċ import Ġarrow . core . extensions . mon oid Ċ import Ġarrow . core . extensions . mon oid . in variant . in variant Ċ import Ġarrow . test . Unit Spec Ċ import Ġarrow . test . generators . Gen K Ċ import Ġarrow . test . l aws . Invariant L aws Ċ import Ġarrow . test . l aws . equal Under The Law Ċ import Ġio . kot lint est . properties . Gen Ċ Ċ class ĠMon oid Test Ġ: ĠUnit Spec () Ġ{ ĊĊĠ Ġfun ĠE QK () Ġ= Ġobject Ġ: ĠEq K < For Mon oid > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġ< A > ĠKind < For Mon oid , ĠA >. eq K ( other : ĠKind < For Mon oid , ĠA >, ĠE Q : ĠEq < A >): ĠBoolean Ġ= ĊĠĠĠĠĠ Ġ( this . fix () Ġto Ġother . fix ()). let Ġ{ Ġ( ls , Ġrs ) Ġ-> ĊĊĠĠĠĠĠĠĠ Ġval Ġl Ġ= Ġls . run Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġls . empty (). combine ( ls . empty ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġrs . fix (). run Ġ{ Ġrs . empty (). combine ( rs . empty ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġl . equal Under The Law ( r , ĠE Q ) ĊĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġ< A > Ġgen k ( M : ĠMon oid < A >) Ġ= Ġobject Ġ: ĠGen K < For Mon oid > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġ< A > Ġgen K ( gen : ĠGen < A >): ĠGen < Kind < For Mon oid , ĠA >> Ġ= ĊĠĠĠĠĠ ĠGen . constant ( M ) Ġas ĠGen < Kind < For Mon oid , ĠA >> ĊĠ Ġ} ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġtest L aws ( ĊĠĠĠĠĠ ĠIn variant L aws . l aws ( Mon oid . in variant < Int >(), Ġgen k ( Int . mon oid ()), ĠE QK ()) ĊĠĠĠ Ġ) ĊĠ Ġ} Ċ } Ċ