Svelte FSM with Eventless Transition Support

A tiny, simple, expressive, pragmatic Finite State Machine (FSM) library, optimized for Svelte.

  • tiny: under 1kb (minified); zero dependencies
  • simple: implements core FSM features, not the kitchen sink
  • expressive: FSM constructs are mapped to core JavaScript features (see Usage Overview below)
  • pragmatic: prioritizes developer happiness over strict adherance to FSM or Statechart formalizations
  • Svelte-optimized: implements Svelte's store contract; philosophically aligned – feels at-home in a Svelte codebase

@kineticcafe/svelte-fsm-eventless is an extension to Ken Kunz's excellent svelte-fsm. The eventless transition support should be sufficient for most purposes, but it has only been tested for our purposes. You can watch kenkunz/svelte-fsm#10 for progress on the core implementation of eventless transitions. When svelte-fsm supports eventless transitions natively, we are likely to retire this library.

Quick Start

Installation

npm install @kineticcafe/svelte-fsm-eventless

Create your first FSM and use it in a Svelte component

<script>
  import fsm from '@kineticcafe/svelte-fsm-eventless';

  const simpleSwitch = fsm('off', {
    off: { toggle: 'on' },
    on: { toggle: 'off' }
  });
</script>

<button value={$simpleSwitch} on:click={simpleSwitch.toggle}>
  {$simpleSwitch}
</button>

Usage Overview

Svelte FSM's API is delightfully simple. FSM constructs are intuitively mapped to core JavaScript language features, resulting in a highly expressive API that's effortless to remember, a joy to write, and natural to read.

  • an fsm is defined by calling the default export fsm() function with 2 arguments: initial and states
  • states is just an object consisting of nested state objects, which consist of…
    • transitions – property values or action return values that match another state
    • actions – functions that optionally transition (return a state)
  • events are invoked on a state machine as function calls, returning the resulting state
  • timers (often used in state machines) are available by calling .debounce(wait) on any event
  • context is just… context (i.e., the lexical scope of your fsm)

Next Steps

Svelte Summit video

Contributors

This extension would not exist without the excellent base library by kenkunz.

Top categories

Loading Svelte Themes