# motor-reflection Reflect on typeclasses following Motor FSM conventions, using Template Haskell. **This package is experimental!** ## Usage First, you need to import the reflection module and the `Event` type: ``` haskell import Motor.FSM.Reflection import Motor.FSM.Reflection.Event (Event) ``` Given that your FSM typeclass follows Motor's conventions, you can reflect to get a list of events: ``` haskell data Open data Closed class MonadFSM m => Door (m :: Row * -> Row * -> * -> *) where type State m :: * -> * initial :: Name n -> Actions m '[n !+ State m Open] r () close :: Name n -> Actions m '[n :-> State m Open !--> State m Closed] r () open :: Name n -> Actions m '[n :-> State m Closed !--> State m Open] r () end :: Name n -> Actions m '[n !- State m Closed] r () reflectEvents ''Door "doorEvents" ``` The last line, using `reflectEvents`, will define `doorEvents :: [Motor.FSM.Reflection.Event.Event]` at the top-level. ### Conventions * The typeclass must have an associated type (open type family) called `State`, parameterized by the instance, with a result of kind `* -> *`. * Each FSM event in the typeclass must have a return type of the `Actions` type alias, listing the additions, deletions, and transitions of named resources. These conventions may be relaxed in the future. This package is new and experimental. ## License Mozilla Public License Version 2.0, see `LICENSE` file in each package.