• Stars
    star
    271
  • Rank 151,156 (Top 3 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created over 3 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Tiny, expressive finite state machines for svelte

Svelte FSM

Svelte FSM logo

A tiny, simple, expressive, pramgmatic 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

Quick Start

Installation

npm install svelte-fsm

Create your first FSM and use it in a Svelte component

<script>
  import fsm from 'svelte-fsm';

  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

  • Thank you @ivanhofer for contributing TypeScript declarations, resulting in an improved developer experience.
  • Thank you @morungos for contributing a fix for #8 (derived stores) by eliminating subscribe overloading.