module Driver.Simplified ( Transition , DriverState , applyTransition , initDriverState , takeState ) where import When import Log (DriverState, initDriverState, takeState) import qualified Log as D import Data.Time.Clock import Data.List -------------- type Transition st = st -> Maybe st ----------------- applyTransition :: (Ord event, Show event, Show b) => LogState -> DriverState st event -> [(st -> Bool, event, st -> When)] -> (UTCTime -> b -> IO ()) -> (event -> Transition st) -> event -> IO () applyTransition logState dst triggers handleResponse transition a = D.applyTransition logState dst handleResponse tr a where tr e st | Just (res, new_st) <- transition e st = (cancelled res, triggered res, f2 e res, new_st) | otherwise = ([], [], f1 e, st)