packages feed

motor-0.3.0: test/Motor/FSMSpec.hs

{-# LANGUAGE DataKinds        #-}
{-# LANGUAGE PolyKinds        #-}
{-# LANGUAGE RebindableSyntax #-}
{-# LANGUAGE TypeOperators    #-}
module Motor.FSMSpec where

import           Prelude               hiding ((>>), (>>=))

import           Control.Monad.Indexed
import           Data.Row.Records

import           Motor.FSM

data S1 = S1
data S2 = S2

n1 :: Name "n1"
n1 = Name

n2 :: Name "n2"
n2 = Name

s1s2 :: MonadFSM m => Name n -> m r (Modify n S2 r) ()
s1s2 s = enter s S2

s2s1 :: MonadFSM m => Name n -> m r (Modify n S1 r) ()
s2s1 s = enter s S1


dropS1 :: MonadFSM m => Name n -> m r (r .- n) ()
dropS1 = delete

test :: MonadFSM m => m Empty Empty ()
test = do
  new n1 S1
  s1s2 n1
  s2s1 n1

  new n2 S2
  s1s2 n2
  s2s1 n2

  dropS1 n1
  dropS1 n2
  where
    (>>) a = (>>>=) a . const