package Ġcom . github . fs bar ata . functional . control Ċ Ċ import Ġorg . junit . Test Ċ Ċ interface ĠMonad Plus L aws < M >: ĠMonad L aws < M > Ġ{ Ċ ĉ override Ġval Ġmon ad Scope : ĠMonad Plus . Scope < M > ĊĊ ĉ private Ġval Ġempty Ġget () Ġ= Ġmon ad Scope . empty < Any >() Ġas ĠMonad Plus < M , ĠAny > ĊĊ ĉ @ Suppress (" UN CHECK ED _ CAST ") Ċ ĉ private Ġfun Ġ< T > Ġeach Po ss ibility Monad Plus ( block : Ġ( Monad Plus < M , ĠInt >) Ġ-> ĠT ) Ġ= Ċĉ ĉ each Po ss ibility Ġ{ Ġblock ( it Ġas ĠMonad Plus < M , ĠInt >) Ġ} ĊĊ ĉ @ Test Ċ ĉ fun Ġ` left Ġzero `() Ġ{ Ċĉ ĉ each Po ss ibility Monad Plus Ġ{ Ġmp Ġ-> Ċĉĉ ĉ assertEqual F ( empty , Ġempty . bind Ġ{ Ġmp Ġ}) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ @ Test Ċ ĉ fun Ġ` right Ġzero `() Ġ{ Ċĉ ĉ each Po ss ibility Monad Plus Ġ{ Ġmp Ġ-> Ċĉĉ ĉ assertEqual F ( empty , Ġmp . bind Ġ{ Ġempty Ġ}) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ @ Test Ċ ĉ fun Ġ` filter Ġfrom Ġbind `() Ġ{ Ċĉ ĉ each Po ss ibility Monad Plus Ġ{ Ġmp Ġ-> Ċĉĉ ĉ val Ġf Ġ= Ġ{ Ġa : ĠInt Ġ-> Ġa Ġ> Ġ 3 Ġ} Ċĉĉ ĉ assertEqual F ( mp . filter From Bind ( f ), Ġmp . filter ( f )) Ċĉ ĉ } Ċ ĉ } Ċ } Ċ