package Ġcom . an up co wk ur . state lin Ċ Ċ class ĠMachine ( state : ĠState ) Ġ{ ĊĠĠĠ Ġvar Ġstate : ĠState Ġ= Ġstate ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ== Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . on Exit ?. invoke () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . on Enter ?. invoke () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġval Ġevent Handlers Ġ= Ġmutable Set Of < Trigger Handler >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . on Enter ?. invoke () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Trigger Handler ( trigger Handler : ĠTrigger Handler ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! event Handlers . add ( trigger Handler )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Trigger Handler Ġ${ trigger Handler . state } Ġ-> Ġ${ trigger Handler . trigger } Ġis Ġalready Ġadded ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtrigger ( trigger : ĠTrigger ) Ġ{ ĊĠĠĠĠĠĠĠ Ġevent Handlers . first OrNull Ġ{ Ġit . state Ġ== Ġstate Ġ&& Ġit . trigger Ġ== Ġtrigger Ġ} ?. handler ?. invoke () ĊĠĠĠ Ġ} Ċ Ċ }