Skip to content

Instantly share code, notes, and snippets.

@frame-lang
Last active November 7, 2018 04:05
Show Gist options
  • Save frame-lang/d2f6317b38961585ecba0748eadc8f4b to your computer and use it in GitHub Desktop.
Save frame-lang/d2f6317b38961585ecba0748eadc8f4b to your computer and use it in GitHub Desktop.
//-------------------------------------------------//
// //
// FMN //
// //
//-------------------------------------------------//
#FrameInterfaceAndEventsController
-interface-
start[initState:string] @(|>>|)
stop @(|<<|)
off
on
status:string
-machine-
$Begin => $Default
|>>|
-> $getInitState(@[initState]) ^
$Off => $Default
|>| turnOff() ^
|on| -> $On ^
|status| ^("off")
$On => $Default
|>| turnOn() ^
|off| -> $Off ^
|status| ^("on")
$End
$Default
|<<| -> $End ^
|status| ^("unknown")
//-------------------------------------------------//
// //
// Implementation //
// //
//-------------------------------------------------//
class FrameEvent {
var _msg:String
var _params:Object
var _return:Object
FrameEvent(msg:String, params:Object = null) {
_msg = msg
_params = params
}
}
//-------------------------------------------------//
class FrameInterfaceAndEventsController {
/**********************************
-interface-
start[initState:string] @(|>>|)
stop @(|<<|)
off
on
status:string
***********************************/
func start(initState:string) {
var params = { "initState":initState }
var e = new FrameEvent(">>", params)
_state(e)
}
func stop() { _state(new FrameEvent("<<")) }
func off() { _state(new FrameEvent("off")) }
func on() { _state(new FrameEvent("on")) }
func status() {
var e = new FrameEvent("status")
_state(e)
return e._return
}
// -machine-
var _state(e:FrameEvent) = Begin
/**********************************
$Begin => $Default
|>>|
-> $getInitState(@[initState]) ^
***********************************/
func Begin(e:FrameEvent) {
if (e._msg == ">>") {
_transition(getInitState(e._params["initState"]))
return
}
Default(e)
}
/**********************************
$Off => $Default
|>| turnOff() ^
|on| -> $On ^
|status| ^("off")
***********************************/
func Off(e:FrameEvent) {
if (e._msg == ">") {
turnOff()
return
}
if (e._msg == "OK") {
_transition(NeedRequest)
return
}
if (e._msg == "Error") {
_transition(Error)
return
}
Default(e)
}
/**********************************
$On => $Default
|>| turnOn() ^
|off| -> $Off ^
|status| ^("on")
***********************************/
func On(e:FrameEvent) {
if (e._msg == ">") {
turnOn()
return
}
if (e._msg == "off") {
_transition(Off)
return
}
if (e._msg == "status") {
e._return = "on"
return
}
Default(e)
}
/**********************************
$End
***********************************/
func End(e:FrameEvent) {
}
/**********************************
$Default
|<<| -> $End ^
|status| ^("unknown")
***********************************/
func Default(e:FrameEvent) {
if (e._msg == "<<") {
_transition(End)
return
}
if (e._msg == "status") {
e._return = "unknown"
return
}
}
//----------------------------------
// Machinery
//----------------------------------
func _transition(newState:FrameState) {
_state(new FrameEvent("<"))
_state = newState
_state(new FrameEvent(">"))
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment