package Ġrule Ċ Ċ @ Dsl Marker Ċ annotation Ġclass ĠRule Marker Ċ Ċ class ĠRule < T > Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġval Ġid : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġval Ġname : ĠString ?, ĊĠĠĠĠĠĠĠ Ġvar Ġdescription : ĠString ?, ĊĠĠĠĠĠĠĠ Ġval Ġcondition : ĠPredicate < T >, ĊĠĠĠĠĠĠĠ Ġval Ġaction : Ġ() Ġ-> ĠUnit Ċ ) Ġ{ ĊĊĠĠĠ Ġfun Ġfire ( t : ĠT ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( condition ( t )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Rule Marker ĊĠĠĠ Ġclass ĠBuilder < T >( val Ġid : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġname : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġdescription : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġcondition : ĠPredicate < T > Ġ= ĠCondition < T >{ false } ĊĠĠĠĠĠĠĠ Ġvar Ġaction : Ġ() Ġ-> ĠUnit Ġ= Ġ{} ĊĊĠĠĠĠĠĠĠ Ġfun ĠsetName ( name : ĠString ?) Ġ= Ġapply Ġ{ Ġthis . name Ġ= Ġname Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġset Description ( description : ĠString ?) Ġ= Ġapply Ġ{ Ġthis . description Ġ= Ġdescription Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġset Condition ( block : ĠPredicate < T >) Ġ= Ġapply Ġ{ Ġthis . condition Ġ= Ġblock } ĊĠĠĠĠĠĠĠ Ġfun Ġset Action ( block : Ġ() Ġ-> ĠUnit ) Ġ= Ġapply Ġ{ Ġthis . action Ġ= Ġblock Ġ} ĊĠĠĠĠĠĠĠ Ġfun Ġbuild (): ĠRule < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRule ( id , Ġname , Ġdescription , Ġcondition , Ġaction ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T > Ġrule ( id : ĠString , Ġfn : ĠRule . Builder < T >. () Ġ-> ĠUnit ): ĠRule < T > Ġ{ ĊĠĠĠ Ġreturn ĠRule . Builder < T >( id ). apply ( fn ). build () Ċ } Ċ