packages feed

minesweeper-0.8.8: Driver/Simplified.hs

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
    :: (Eq a, Ord a, Show a, Show b) 
    => LogState
    -> DriverState st a
    -> [(st -> Bool, a, st -> When)]
    -> (UTCTime -> b -> IO ())
    -> (a -> Transition st) 
    -> a
    -> 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)