package Ġio . sm al libs . pil in . standard Ċ Ċ import Ġio . sm al libs . pil in . control . Applic ative Ċ import Ġio . sm al libs . pil in . control . Functor Ċ import Ġio . sm al libs . pil in . control . Monad Ċ import Ġio . sm al libs . pil in . standard . Option . TK . Companion . fix Ċ import Ġio . sm al libs . pil in . type . App Ċ Ċ object ĠOption Ġ{ ĊĊĠĠĠ Ġsealed Ġclass ĠT < A > Ġ: ĠApp < TK , ĠA > Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠNone < A >( private Ġval Ġu : ĠUnit Ġ= ĠUnit ) Ġ: ĠT < A >() ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠSome < A >( val Ġvalue : ĠA ) Ġ: ĠT < A >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠTK Ġprivate Ġconstructor () Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ< A > ĠApp < TK , ĠA >. fix : ĠT < A > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis Ġas ĠT < A > ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠFun ctor Impl Ġ: ĠFun ctor . API < TK > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġ< A , ĠB > Ġmap ( f : Ġsuspend Ġ( A ) Ġ-> ĠB ): Ġsuspend Ġ( App < TK , ĠA >) Ġ-> ĠApp < TK , ĠB > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġma Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġa Ġ= Ġma . fix ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠT . Some Ġ-> ĠT . Some ( f ( a . value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠT . None Ġ-> ĠT . None () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠApplic ative Impl ( override Ġval Ġfunctor : ĠFun ctor . Core < TK >) Ġ: ĊĠĠĠĠĠĠĠ ĠApplic ative . API < TK >, ĊĠĠĠĠĠĠĠ ĠApplic ative . With Pure Map And Product < TK >, ĊĠĠĠĠĠĠĠ ĠApplic ative . Via Functor < TK > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġ< A > Ġpure ( a : ĠA ): ĠApp < TK , ĠA > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠT . Some ( a ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġ< A , ĠB > Ġproduct ( ma : ĠApp < TK , ĠA >): Ġsuspend Ġ( mb : ĠApp < TK , ĠB >) Ġ-> ĠApp < TK , ĠPair < A , ĠB >> Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġmb Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġa Ġ= Ġma . fix ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠT . Some Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġb Ġ= Ġmb . fix ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠT . Some Ġ-> ĠT . Some ( a . value Ġto Ġb . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠT . None Ġ-> ĠT . None () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠT . None Ġ-> ĠT . None () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠMonad Impl ( override Ġval Ġapplic ative : ĠApplic ative . API < TK >) Ġ: ĊĠĠĠĠĠĠĠ ĠMonad . API < TK >, ĊĠĠĠĠĠĠĠ ĠMonad . With Returns Map And Join < TK >, ĊĠĠĠĠĠĠĠ ĠMonad . Via Applic ative < TK >, ĊĠĠĠĠĠĠĠ ĠApplic ative . Core < TK > Ġby Ġapplic ative Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġ< A > Ġjoin ( mma : ĠApp < TK , ĠApp < TK , ĠA >> ): ĠApp < TK , ĠA > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġma Ġ= Ġm ma . fix ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠT . Some Ġ-> Ġma . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠT . None Ġ-> ĠT . None () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġ< A , ĠB > Ġmap ( f : Ġsuspend Ġ( A ) Ġ-> ĠB ): Ġsuspend Ġ( App < TK , ĠA >) Ġ-> ĠApp < TK , ĠB > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġapplic ative . map ( f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġfunctor : ĠFun ctor . API < TK > Ġ= ĠFun ctor Impl () ĊĊĠĠĠ Ġval Ġapplic ative : ĠApplic ative . API < TK > Ġ= ĠApplic ative Impl ( functor ) ĊĊĠĠĠ Ġval Ġmon ad : ĠMonad . API < TK > Ġ= ĠMonad Impl ( applic ative ) Ċ Ċ }