module Transition ( buildTransition ) where import When import Driver.Log --------------------------------------------------- {- transition :: Event -> Transition State Event Responses transition e ost = buildTransition (==Init) triggers' nextState responses e ost -} ------------------------------ buildTransition :: Eq e => (e -> Bool) -- event is initial -> [(st -> Bool, e, st -> When)] -- trigger table -> (e -> st -> Maybe st) -- transition -> (e -> st -> st -> r) -- response -> e -- event -> Transition st e r buildTransition isInit triggers nextState responses e ost | Just st <- nextState e ost = Just (Result { cancelled = cancelled_ e ost st , triggered = reactions e ost st , result = responses e ost st } , st) | otherwise = Nothing where reactions e ost st = [ (wh st, t) | (p, t, wh) <- triggers , p st , e == t || isInit e || not (p ost) ] cancelled_ e ost st = [ t | (p, t, _) <- triggers , not (p st) , p ost , e /= t ] initReactions st = [ (wh st, t) | (p, t, wh) <- triggers , p st ]