module Data.Reactor.Serialization (parseSerialReactor, SerialReactor, Serialization) where import Control.Monad (forM) import Data.Reactor.Untypeds (ParseSerial) import Data.Reactor.MinimalGraph (MinimalGraph (..)) import Data.Reactor.Reaction (External, Recover) type ReactionStates = [[Maybe Recover]] type SerialExternal c = (c,External,[[Maybe Recover]]) -- | active serialization of a reactor type Serialization c = MinimalGraph (SerialExternal c) -- | passive serialization of a reactor type SerialReactor c = (ReactionStates,[SerialExternal c]) parseReactionStates :: ParseSerial ReactionStates parseReactionStates ps mrs = forM mrs $ \rs -> forM rs $ maybe (Just Nothing) (fmap Just . ps) parseSerialExternal :: ParseSerial (SerialExternal c) parseSerialExternal ps (c,e,mrs) = do e' <- ps e mrs' <- parseReactionStates ps mrs return (c,e',mrs') -- | a SerialReactor parser. It tries to fix the existentials, in the Recover and External boxes. Possible templates must be given for the task. parseSerialReactor :: ParseSerial (SerialReactor c) parseSerialReactor ps (mrs,ss) = do mrs' <- parseReactionStates ps mrs ss' <- mapM (parseSerialExternal ps) ss return (mrs',ss')