Some examples:
The traffic light. Now with behavior
Non-hierarchical Traffic Light
// State Machine Type TrafficLight :> Green | Yellow | Red // State Machine Reactions // Collapsed view TrafficLight // scope ! NEXT // transition name // State Machine Reactions // expanded view TrafficLight // scope ! NEXT : Green -> Yellow // reaction ! NEXT : Yellow -> Red // reaction ! NEXT : Red -> Green // reaction // State Machine Boundary Actions TrafficLight :> | Green >> after(<duration>)( NEXT ) // boundary action | Yellow >> after(<duration>)( NEXT ) // boundary action | Red >> after(<duration>)( NEXT ) // boundary action
Counter
And the almost simplest counter from 15js:
// State Machine Type Counter :> <int> // State Machine Reactions // collpased view Counter // scope ! INCR // transition name ! RESET // transition name ! DECR // transition name // State Machine Reactions // expanded view Counter // scope ! INCR : : ( n ) => n + 1 // reaction ! RESET : : ( _n ) => 0 // reaction ! DECR : : ( n ) => n - 1 // reaction // Note that the reconstructor part is empty
The Linksy Kitchen Timer
(It is the timer in the banner art above.)
// State Machine Type LinksyKitchenTimer :> | Setting :> ( <int min>, <int sec> ) | Ticking :> ( <int sec> ) | Paused :> ( <int sec> ) | Alarming.
// State Machine Reactions LinksyKitchenTimer // scope ! START : Setting -> Ticking : ( m, s ) => m*60 + s // reaction ! PAUSE : Ticking -> Paused : ( s ) => s ! CANCEL : Paused -> Setting : <history> // residual state is memoized ! RESTART : Paused -> Ticking : ( s ) => s ! OK : Alarming -> Setting : <history> // residual state is memoized ! TIC : Ticking -> Alarming LinksyKitchenTimer :> Ticking // scope ! TIC : : gt(0) ( s ) => s-1 // reaction LinksyKitchenTimer :> Setting // scope ! M10 : : ( m, s ) = ( m+10, s ) // reaction ! M5 : : ( m, s ) = ( m+ 5, s ) ! M3 : : ( m, s ) = ( m+ 3, s ) ! M1 : : ( m, s ) = ( m+ 1, s ) ! S10 : : ( m, s ) = ( m, s+10 )
// State Machine Boundary Actions LinksyKitchenTimer :> Ticking // scope >> after( 1s )( TIC ) // boundary action LinksyKitchenTimer :> Alarming // scope >> after( 30s )( OK ) // boundary action >> <start/stop sound> // boundary action
Separate definitions are preferred
The Behavior part seems to be 3-10 times larger than the State Type definitions if measured in SLOC. That, I think is a good argument for giving the type information separately; it might otherwise be less readable and less useful.
Top comments (0)