package Ġorg . random cat . ag or abot . commands . impl Ċ Ċ sealed Ġclass ĠRequirement Result < out ĠT > Ġ{ ĊĠĠĠ Ġdata Ġclass ĠSuccess < T >( val Ġrequirement : ĠT ) Ġ: ĠRequirement Result < T >() ĊĠĠĠ Ġobject ĠFailure Ġ: ĠRequirement Result < Nothing >() Ċ } Ċ Ċ private Ġinline Ġfun Ġ< C , ĠA , ĠOut Requirement > ĠPending Invocation < Context Receiver Arg < C , ĠBase Command Execution Receiver , ĠA >> . prepend Requirement ( ĊĠĠĠ Ġcross inline Ġfactory : Ġ( C ) Ġ-> ĠRequirement Result < Out Requirement >, Ċ ): ĠPending Invocation < Context Receiver Arg < C , ĠBase Command Execution Receiver Re qu iring < Out Requirement >, ĠA >> Ġ{ ĊĠĠĠ Ġreturn Ġprepend Transform Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġrequirement Result Ġ= Ġfactory ( input . context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRequirement Result . Success Ġ-> ĠPre pend Transform Result . Continue Execution ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Receiver Arg ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= Ġinput . context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver Ġ= Ġobject Ġ: ĠBase Command Execution Receiver Re qu iring < Out Requirement >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBase Command Execution Receiver Ġby Ġinput . receiver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrequirement (): ĠOut Requirement Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrequirement Result . requirement ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarg Ġ= Ġinput . arg , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRequirement Result . Failure Ġ-> ĠPre pend Transform Result . Stop Execution ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< C , ĠOut Requirement > Ġmerge Requirements ( ĊĠĠĠ Ġcontext : ĠC , ĊĠĠĠ Ġvar arg Ġrequirement Factories : Ġ( C ) Ġ-> ĠRequirement Result < Any >, ĊĠĠĠ Ġdo Merge : Ġ( List < Any >) Ġ-> ĠOut Requirement , Ċ ): ĠRequirement Result < Out Requirement > Ġ{ ĊĠĠĠ Ġval Ġrequirements Ġ= Ġrequirement Factories . map Ġ{ Ġfactory Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġresult Ġ= Ġfactory ( context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRequirement Result . Success Ġ-> Ġresult . requirement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRequirement Result . Failure Ġ-> Ġreturn ĠRequirement Result . Failure ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠRequirement Result . Success ( do Merge ( requirements )) Ċ } Ċ Ċ fun Ġ< Context , ĠArg , ĠOut Requirement > ĠPending Invocation < Context Receiver Arg < Context , ĠBase Command Execution Receiver , ĠArg >> . requires ( ĊĠĠĠ Ġset : ĠRequirement Set < Context , ĠOut Requirement >, Ċ ): ĠPending Invocation < Context Receiver Arg < Context , ĠBase Command Execution Receiver Re qu iring < Out Requirement >, ĠArg >> Ġ{ ĊĠĠĠ Ġreturn Ġprepend Requirement ( set :: create ) Ċ } Ċ Ċ fun Ġ< Context , ĠArg , ĠOut Requirement > ĠPending Invocation < Context Receiver Arg < Context , ĠBase Command Execution Receiver , ĠArg >> . requires ( ĊĠĠĠ Ġset : ĠRequirement Set < Context , ĠOut Requirement >, ĊĠĠĠ Ġblock : ĠBase Command Execution Receiver Re qu iring < Out Requirement >. ( Arg ) Ġ-> ĠUnit , Ċ ) Ġ{ ĊĠĠĠ Ġreturn Ġrequires ( set ). execute Ġ{ Ġblock ( it . receiver , Ġit . arg ) Ġ} Ċ } Ċ Ċ interface ĠRequirement Set < in ĠContext , Ġout ĠOut Requirement > Ġ{ ĊĠĠĠ Ġfun Ġcreate ( context : ĠContext ): ĠRequirement Result < Out Requirement > Ċ } Ċ