packages feed

cpsa-3.6.3: src/CPSA/Lib/State.hs

module CPSA.Lib.State where

import Data.Maybe (catMaybes)
import CPSA.Lib.Algebra
import CPSA.Lib.Utilities

-- A transition (pre-state, post-state)
newtype Tran t = Tran (Maybe t, Maybe t) deriving (Show, Eq, Ord)

now :: Tran t -> Maybe t
now (Tran (t, _)) = t

next :: Tran t -> Maybe t
next (Tran (_, t)) = t

observer :: Tran t -> Bool
observer (Tran (_, Nothing)) = True
observer _ = False

path :: Tran t -> Bool
path x = not (observer x)

transition :: Tran t -> Bool
transition (Tran (Just _, Just _)) = True
transition _ = False

tranTerms :: Tran t -> [t]
tranTerms (Tran (Nothing, Nothing)) =
  assertError ("Encountered sync with no pre- or post-state in State.hs:tranTerms")
tranTerms (Tran (now, next)) =
  catMaybes [now, next]

mapTran :: (t -> t) -> Tran t -> Tran t
mapTran f (Tran (now, next)) =
  Tran (maybe Nothing (Just . f) now, maybe Nothing (Just . f) next)

matchTran :: Algebra t p g s e c => Tran t -> Tran t -> (g, e) -> [(g, e)]
matchTran (Tran (c, n)) (Tran (c', n')) ge =
  do
    ge <- matchNext c c' ge
    matchNext n n' ge

matchNext :: Algebra t p g s e c => Maybe t -> Maybe t -> (g, e) -> [(g, e)]
matchNext Nothing Nothing ge = [ge]
matchNext (Just t) (Just t') ge = match t t' ge
matchNext _ _ _ = []

unifyTran :: Algebra t p g s e c => Tran t -> Tran t -> (g, s) -> [(g, s)]
unifyTran (Tran (c, n)) (Tran (c', n')) gs =
  do
    gs <- unifyNext c c' gs
    unifyNext n n' gs

unifyNext :: Algebra t p g s e c => Maybe t -> Maybe t -> (g, s) -> [(g, s)]
unifyNext Nothing Nothing ge = [ge]
unifyNext (Just t) (Just t') ge = unify t t' ge
unifyNext _ _ _ = []