-----------------------------------------------------------------------------
-- |
-- Module      :  Control.AFSM
-- Copyright   :  (c) Hanzhong Xu, Meng Meng 2016,
-- License     :  MIT License
--
-- Maintainer  :  hanzh.xu@gmail.com
-- Stability   :  experimental
-- Portability :  portable
--
-- Arrowized functional state machines.
--
--   This module is inspired by Yampa and the paper
--   /Functional Reactive Programming, Continued*/ written by
--     Henrik Nilsson, Antony Courtney and John Peterson.
-----------------------------------------------------------------------------

module Control.AFSM (
  -- module Control.Category,
  -- module Control.Arrow,

  Event(..),

  SMFunctor(..),
  
  -- * The 'TF' type
  TF(..),
  
  transSM2TF,

  -- * The 'SM' type
  SM(..),
  
  -- * SM Constructors
  newSM,
  simpleSM,
  
  tf, st,

  -- * The 'SMH' type - SM with hidden storage
  SMH(..),

  newSMH,
  simpleSMH,

  hideStorage,

  -- * Source Constructors
  buildSrc,
  simpleSrc,

  -- * Basic State Machines
  constSM,
  idSM,

  delaySM,

  arrSM,

  foldlSM,
  foldlDelaySM,


  -- * Basic SM functions
  composeSM, (>>>>), (<<<<), (^>>>), (>>>^), (^<<<), (<<<^),

  firstSM, secondSM, (****), (&&&&),
  
  leftSM, rightSM, (++++), (||||),
  
  loopSM,
  

  absorb,
  merge,

  -- * High order Machines
  execSM,
  concatSM,

  -- * Evaluation
  step,
  exec


) where

import Control.Arrow
import Control.AFSM.CoreType
import Control.AFSM.Util
import Control.AFSM.Core
import Control.AFSM.Event
import Control.AFSM.TF
import Control.AFSM.SMFunctor
import Control.AFSM.SMH
import Data.SF