packages feed

minesweeper-0.8.8: Transition.hs

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
            ]