{"id":21282342,"url":"https://github.com/danpersa/edge-state-machine-scala","last_synced_at":"2025-07-08T04:05:01.181Z","repository":{"id":11389132,"uuid":"13831569","full_name":"danpersa/edge-state-machine-scala","owner":"danpersa","description":null,"archived":false,"fork":false,"pushed_at":"2013-11-01T09:25:44.000Z","size":120,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-15T14:26:36.075Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Scala","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/danpersa.png","metadata":{"files":{"readme":"README.rdoc","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2013-10-24T12:35:02.000Z","updated_at":"2013-11-01T09:25:46.000Z","dependencies_parsed_at":"2022-07-14T02:20:30.358Z","dependency_job_id":null,"html_url":"https://github.com/danpersa/edge-state-machine-scala","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/danpersa/edge-state-machine-scala","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danpersa%2Fedge-state-machine-scala","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danpersa%2Fedge-state-machine-scala/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danpersa%2Fedge-state-machine-scala/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danpersa%2Fedge-state-machine-scala/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/danpersa","download_url":"https://codeload.github.com/danpersa/edge-state-machine-scala/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danpersa%2Fedge-state-machine-scala/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264192262,"owners_count":23570743,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-21T10:54:24.076Z","updated_at":"2025-07-08T04:05:01.166Z","avatar_url":"https://github.com/danpersa.png","language":"Scala","funding_links":[],"categories":[],"sub_categories":[],"readme":"= Edge State Machine\n\n== State Machine Examples\n\n=== User State Machine\n\n==== Define\n\n  class User(var state: State = State(\"pending\")) extends AbstractStateMachine {\n    state(\"pending\")\n    state(\"active\")\n    state(\"blocked\")\n\n    event(\"activate\")  {\n      transition(_, from = Set(\"pending\", \"blocked\"), to = \"active\", doActivate)\n    }\n\n    event(\"block\") {\n      transition(_, from = Set(\"active\"), to = \"blocked\", doBlock)\n    }\n\n    def doBlock = println(\"do_block\")\n\n    def doActivate = println(\"do_activate\")\n  }\n  \n==== Use\n\n  val user = new User()\n  // user.state must beEqualTo(State(\"pending\"))\n  user activate()\n  // user.state must beEqualTo(State(\"active\"))\n  user block()\n  // user.state must beEqualTo(State(\"blocked\"))\n  user activate()\n  // user.state must beEqualTo(State(\"active\"))\n\n=== Dice State Machine\n\n==== Define\n\n  object DiceStates {\n    val states: List[String] = List(\"one\", \"two\", \"three\", \"four\", \"five\", \"six\")\n    val statesSet: Set[String] = states.to[Set]\n  }\n\n  class Dice(var state: State = State(\"one\")) extends AbstractStateMachine {\n    state(\"one\")\n    state(\"two\")\n    state(\"three\")\n    state(\"four\")\n    state(\"five\")\n    state(\"six\")\n\n    event(\"roll\") {\n      transition(_, from = DiceStates.statesSet,\n        to = DiceStates.statesSet,\n        guard = rollResult,\n        onTransition = displayDiceRollingAnimation)\n    }\n\n    def rollResult = { State(DiceStates.states(Random.nextInt(6))) }\n    def displayDiceRollingAnimation = println(print(s\"--------------- DICE: throw: $state ------------\"))\n  }\n  \n==== Use\n\n  val dice = new Dice()\n  dice.roll()\n  // dice.state.name must(beOneOf(\"one\", \"two\", \"three\", \"four\", \"five\", \"six\"))","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanpersa%2Fedge-state-machine-scala","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdanpersa%2Fedge-state-machine-scala","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanpersa%2Fedge-state-machine-scala/lists"}