module Ideas.Service.State
(
State, makeState, makeNoState, emptyStateContext, emptyState
, exercise, statePrefixes, stateContext, stateTerm, stateLabels
) where
import Data.List
import Data.Maybe
import Ideas.Common.Library
import Ideas.Common.Strategy.Abstract (LabelInfo)
import Ideas.Common.Strategy.Prefix (activeLabels)
data State a = State
{ exercise :: Exercise a
, statePrefixes :: [Prefix (Context a)]
, stateContext :: Context a
}
instance Show (State a) where
show s = unlines $ "State {" : map (" "++) xs ++ ["}"]
where
xs = [ "exercise = " ++ showId s
, "prefix = " ++ intercalate ";" (map show (statePrefixes s))
, "steps = " ++ intercalate ";" (map (show . prefixToSteps) (statePrefixes s))
, "term = " ++ prettyPrinterContext (exercise s) (stateContext s)
]
instance HasId (State a) where
getId = getId . exercise
changeId f s = s { exercise = changeId f (exercise s) }
instance HasEnvironment (State a) where
environment = environment . stateContext
setEnvironment env s =
s { stateContext = setEnvironment env (stateContext s) }
stateTerm :: State a -> a
stateTerm = fromMaybe (error "invalid term") . fromContext . stateContext
stateLabels :: State a -> [[LabelInfo]]
stateLabels state =
map (filterRules . activeLabels) $ statePrefixes state
where
rs = ruleset $ exercise state
isRule = flip elem (map getId rs) . getId
filterRules = filter (not . isRule)
makeState :: Exercise a -> [Prefix (Context a)] -> Context a -> State a
makeState = State
makeNoState :: Exercise a -> Context a -> State a
makeNoState = flip makeState []
emptyStateContext :: Exercise a -> Context a -> State a
emptyStateContext ex = makeState ex [pr]
where
pr = emptyPrefix (strategy ex)
emptyState :: Exercise a -> a -> State a
emptyState ex = emptyStateContext ex . inContext ex