motor-0.1.0.0: src/Motor/FSM/Class.hs
-- | The 'MonadFSM' class is the indexed monad for finite-state
-- machines.
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RebindableSyntax #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeFamilyDependencies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
module Motor.FSM.Class
( MonadFSM(..)
, Name (..)
) where
import Control.Monad.Indexed
import Data.OpenRecords
import GHC.TypeLits (Symbol)
-- * FSM monad
-- | An indexed monad for finite-state machines, managing the state
-- of named resources.
class IxMonad m => MonadFSM (m :: (Row *) -> (Row *) -> * -> *) where
-- | Creates a new resource and returns its 'Name'.
new :: Name n -> a -> m r (Extend n a r) ()
-- | Deletes an existing resource named by its 'Name'.
delete :: Name n -> m r (r :- n) ()
-- | Replaces the state of an existing resource named by its 'Name'.
enter :: Name n -> b -> m r (n ::= b :| (r :- n)) ()
-- | A name of a resource, represented using a 'Symbol'.
data Name (n :: Symbol) where
Name :: KnownSymbol n => Name n