package Ġcom . be de ll n . iod ine . interfaces čĊč Ċ import Ġandroidx . compose . runtime .* č Ċ import Ġcom . be de ll n . iod ine . util . map State Flow č Ċ import Ġkotlinx . coroutines . flow .* č Ċ import Ġkotlinx . coroutines . launch čĊč Ċ / **************** ***** ĠBasic Ġinterfaces Ġ***************** *****/ čĊč Ċ interface ĠForm ViewModel < out ĠI , Ġout ĠE , Ġin ĠA , Ġout ĠB > čĊĠĠĠ Ġ: ĠSet table < A >, ĠHas Events < E >, ĠGet table < B >, ĠHas Impl < I > čĊč Ċ interface ĠForm < out ĠI , Ġout ĠE , Ġin ĠA , Ġout ĠB > Ġ: ĠForm ViewModel < I , ĠE , ĠA , ĠB >, ĠHas Contents Ġ{ čĊĠĠĠ Ġ@ Composable čĊĠĠĠ Ġfun Ġresult (): ĠB Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġresult . collect As State () čĊĠĠĠĠĠĠĠ Ġval Ġres Ġby Ġremember Ġ{ Ġstate Ġ} čĊĠĠĠĠĠĠĠ Ġreturn Ġres čĊĠĠĠ Ġ} č Ċ } čĊč Ċ / ************************ ĠType Ġaliases Ġ***************** ***/ čĊč Ċ interface ĠForm Impl < I , ĠE , ĠS , ĠA , ĠB > Ġ: ĠComponent Impl < I , ĠE , ĠS , ĠA >, ĠForm < I , ĠE , ĠA , ĠB > čĊč Ċ type alias ĠS Form Impl < I , ĠE , ĠS , ĠA > čĊĠĠĠĠĠĠĠ Ġ= ĠForm Impl < I , ĠE , ĠS , ĠA , ĠA > čĊč Ċ type alias ĠS Form < I , ĠE , ĠA > čĊĠĠĠĠĠĠĠ Ġ= ĠForm < I , ĠE , ĠA , ĠA > čĊč Ċ type alias ĠForm Impl Description < Ctx , ĠI , ĠE , ĠS , ĠA , ĠB > čĊĠĠĠĠĠĠĠ Ġ= ĠDescription < Ctx , ĠA , ĠForm Impl < I , ĠE , ĠS , ĠA , ĠB >> čĊč Ċ type alias ĠP Form Description < Ctx , ĠI , ĠE , ĠP , ĠA , ĠB > čĊĠĠĠĠĠĠĠ Ġ= ĠDescription < Ctx , ĠP , ĠForm < I , ĠE , ĠA , ĠB >> čĊč Ċ type alias ĠForm Description < Ctx , ĠI , ĠE , ĠA , ĠB > čĊĠĠĠĠĠĠĠ Ġ= ĠP Form Description < Ctx , ĠI , ĠE , ĠA , ĠA , ĠB > čĊč Ċ type alias ĠS Form Description < Ctx , ĠI , ĠE , ĠA > čĊĠĠĠĠĠĠĠ Ġ= ĠDescription < Ctx , ĠA , ĠForm < I , ĠE , ĠA , ĠA >> čĊč Ċ / ************************ * ĠCore Ġutilities Ġ************************* *****/ čĊč Ċ /** čĊ Ġ* ĠConvert Ġa Ġ[ Form ] Ġinto Ġa Ġ[ Component ], Ġignoring Ġthe Ġadditional Ġstructure Ġof Ġthe Ġform . čĊ Ġ* čĊ Ġ* ĠThis Ġis Ġan Ġexplicit Ġcast Ġrather Ġthan Ġa Ġsub typing Ġrelationship Ġto Ġavoid čĊ Ġ* Ġ Ġamb iguity Ġbetween Ġutility Ġfunctions Ġof Ġthe Ġsame Ġname Ġoperating Ġon Ġforms čĊ Ġ* Ġ Ġand Ġcomponents . čĊ Ġ*/ č Ċ fun Ġ< I , E , A , B > ĠForm < I , E , A , B >. as Component (): ĠComponent < I , E , A > Ġ{ čĊĠĠĠ Ġreturn Ġobject : čĊĠĠĠĠĠĠĠ ĠHas Contents Ġby Ġthis , čĊĠĠĠĠĠĠĠ ĠHas Impl < I > Ġby Ġthis , čĊĠĠĠĠĠĠĠ ĠHas Events < E > Ġby Ġthis , čĊĠĠĠĠĠĠĠ ĠSet table < A > Ġby Ġthis , čĊĠĠĠĠĠĠĠ ĠComponent < I , E , A > Ġ{} č Ċ } čĊč Ċ inline Ġfun Ġ< C Ġ: ĠI od ine Context , ĠI , ĠE , ĠP , ĠA , ĠB , ĠX > ĠP Form Description < C , ĠI , ĠE , ĠP , ĠA , ĠB >. omap ( čĊĠĠĠ Ġcross inline Ġf : Ġ( B ) Ġ-> ĠX č Ċ ): ĠP Form Description < C , ĠI , ĠE , ĠP , ĠA , ĠX > Ġ{ čĊĠĠĠ Ġval Ġorig Descr Ġ= Ġthis čĊĠĠĠ Ġreturn Ġobject Ġ: ĠP Form Description < C , ĠI , ĠE , ĠP , ĠA , ĠX > Ġ{ čĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinitialize ( ctx : ĠC , Ġinitial Value : ĠP ): ĠForm < I , ĠE , ĠA , ĠX > Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorig Ġ= Ġorig Descr . initialize ( ctx , Ġinitial Value ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠForm < I , ĠE , ĠA , ĠX > Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Composable čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcontents () Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorig . contents () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġevents : ĠFlow < E > čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġorig . events čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġresult : ĠState Flow < X > čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġorig . result čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map State Flow ( f ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġimpl : ĠI čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġorig . impl čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ@ Composable čĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinit Compose ( ctx : ĠC ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġorig Descr . init Compose ( ctx ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} č Ċ } čĊč Ċ inline Ġfun Ġ< C Ġ: ĠI od ine Context , ĠI , ĠE , ĠA , ĠB , ĠX > ĠForm Description < C , ĠI , ĠE , ĠA , ĠB >. imap ( čĊĠĠĠ Ġcross inline Ġfrom : Ġ( X ) Ġ-> ĠA č Ċ ): ĠForm Description < C , ĠI , ĠE , ĠX , ĠB > Ġ{ čĊĠĠĠ Ġval Ġorig Descr Ġ= Ġthis čĊĠĠĠ Ġreturn Ġobject Ġ: ĠForm Description < C , ĠI , ĠE , ĠX , ĠB > Ġ{ čĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinitialize ( ctx : ĠC , Ġinitial Value : ĠX ): ĠForm < I , ĠE , ĠX , ĠB > Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorig Ġ= Ġorig Descr . initialize ( ctx , Ġfrom ( initial Value )) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠForm < I , ĠE , ĠX , ĠB > Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠsetValue ( newValue : ĠX ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorig . setValue ( from ( newValue )) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Composable čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcontents () Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorig . contents () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġevents : ĠFlow < E > čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġorig . events čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġresult : ĠState Flow < B > čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġorig . result čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġimpl : ĠI čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġorig . impl čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ@ Composable čĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinit Compose ( ctx : ĠC ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġorig Descr . init Compose ( ctx ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} č Ċ } čĊč Ċ inline Ġfun Ġ< C Ġ: ĠI od ine Context , ĠI , ĠE , ĠP , ĠA , ĠB , ĠX > ĠP Form Description < C , ĠI , ĠE , ĠP , ĠA , ĠB >. imap Parameter ( čĊĠĠĠ Ġcross inline Ġfrom : Ġ( X ) Ġ-> ĠP č Ċ ): ĠP Form Description < C , ĠI , ĠE , ĠX , ĠA , ĠB > Ġ{ čĊĠĠĠ Ġval Ġorig Descr Ġ= Ġthis čĊĠĠĠ Ġreturn Ġobject Ġ: ĠP Form Description < C , ĠI , ĠE , ĠX , ĠA , ĠB > Ġ{ čĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinitialize ( ctx : ĠC , Ġinitial Value : ĠX ): ĠForm < I , ĠE , ĠA , ĠB > Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorig Ġ= Ġorig Descr . initialize ( ctx , Ġfrom ( initial Value )) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠForm < I , ĠE , ĠA , ĠB > Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Composable čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcontents () Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorig . contents () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġevents : ĠFlow < E > čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġorig . events čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġresult : ĠState Flow < B > čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġorig . result čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġimpl : ĠI čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġorig . impl čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ@ Composable čĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinit Compose ( ctx : ĠC ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġorig Descr . init Compose ( ctx ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} č Ċ } čĊč Ċ /** ĠSup ply Ġan Ġinitial Ġvalue Ġto Ġa Ġcomponent . Ġ*/ č Ċ fun Ġ< C Ġ: ĠI od ine Context , ĠI , ĠE , ĠP , ĠA , ĠB > ĠP Form Description < C , ĠI , ĠE , ĠP , ĠA , ĠB >. initial Value ( čĊĠĠĠ Ġx : ĠP č Ċ ): ĠP Form Description < C , ĠI , ĠE , ĠUnit , ĠA , ĠB > Ġ= Ġthis . imap Parameter Ġ{ Ġx Ġ} čĊč Ċ /* čĊ Ġ* ĠHelper Ġfunction Ġfor Ġmaking Ġa Ġform Ġfrom Ġa Ġcomp osable Ġfunction Ġfrom čĊ Ġ* Ġthe Ġstate Ġof Ġthe Ġtype Ġof Ġvalues Ġbeing Ġentered Ġby Ġthe Ġform . čĊ Ġ*/ č Ċ inline Ġfun Ġ< C Ġ: ĠI od ine Context , ĠA > ĠCompose Form ( čĊĠĠĠ Ġcross inline Ġf : Ġ@ Composable () ĠC .( A ) Ġ-> ĠUnit č Ċ ): ĠS Form Description < C , ĠUnit , ĠVoid , ĠA > Ġ{ čĊĠĠĠ Ġreturn Ġobject Ġ: ĠS Form Description < C , ĠUnit , ĠVoid , ĠA > Ġ{ čĊčĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinitialize ( ctx : ĠC , Ġinitial Value : ĠA ): ĠS Form Impl < Unit , ĠVoid , ĠA , ĠA > Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠS Form Impl < Unit , ĠVoid , ĠA , ĠA > Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontents Flow Ġ= ĠMutable State Flow ( initial Value ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Composable čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcontents ( state : ĠA ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . f ( state ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġevents : ĠFlow < Void > čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġempty Flow () čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġimpl : ĠUnit čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= ĠUnit čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġresult : ĠState Flow < A > čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġstate čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġstate : ĠState Flow < A > čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġcontents Flow čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} č Ċ }