<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <generator>Persumi - Level up your writing and blogging with AI</generator>
  <category label="Blog" scheme="http://persumi.com/u/fredwu/tech/e/blog" term="blog"/>
  <category label="Tech" scheme="http://persumi.com/u/fredwu/tech" term="tech"/>
  <link href="http://persumi.com/u/fredwu/tech/e/blog/t/javascript"/>
  <link href="http://persumi.com/u/fredwu/tech/e/blog/t/javascript/feed/rss"/>
  <link rel="self" href="http://persumi.com/u/fredwu/tech/e/blog/t/javascript/feed/atom"/>
  <author>
    <name>Fred Wu</name>
    <email>ifredwu@gmail.com</email>
    <uri>http://persumi.com/u/fredwu</uri>
  </author>
  <subtitle/>
  <id>http://persumi.com/u/fredwu/tech/e/blog/t/javascript</id>
  <title>Blog (javascript) - Fred Wu&apos;s Tech</title>
  <updated>2026-05-01T20:13:11.976868Z</updated>
  <entry>
    <content type="html">&lt;![CDATA[&lt;p&gt;
After a few nights of working on the 2.0 rewrite of &lt;a href=&quot;https://github.com/fredwu/jquery-endless-scroll&quot;&gt;jQuery Endless Scroll&lt;/a&gt;, I am now releasing one of the tools I built for the project: &lt;strong&gt;&lt;a href=&quot;https://github.com/fredwu/skinny-coffee-machine&quot;&gt;Skinny Coffee Machine&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;
Skinny Coffee Machine is a simple JavaScript state machine written in CoffeeScript.&lt;/p&gt;
&lt;p&gt;
It is fairly simple to use, with the flexibility of adding and removing observers for state transitions.&lt;/p&gt;
&lt;h3&gt;
Define State Machines&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;coffeescript language-coffeescript&quot;&gt;@coffeeMachine.power = new SkinnyCoffeeMachine
  default: &apos;off&apos;
  events:
    turnOn:
      off: &apos;on&apos;
    turnOff:
      on: &apos;off&apos;
  on:
    turnOn: (from, to) -&gt; &quot;#{from.toUpperCase()} to #{to.toUpperCase()}&quot;
    turnOff: (from, to) -&gt; &quot;#{from.toUpperCase()} to #{to.toUpperCase()}&quot;
  before:
    turnOff: (from, to) -&gt; &quot;Before switching to #{to.toUpperCase()}&quot;
  after:
    turnOn: (from, to) -&gt; &quot;After switching to #{to.toUpperCase()}&quot;
    turnOff: (from, to) -&gt; &quot;After switching to #{to.toUpperCase()}&quot;

@coffeeMachine.mode = new SkinnyCoffeeMachine
  default: &apos;latte&apos;
  events:
    next:
      latte: &apos;cappuccino&apos;
      cappuccino: &apos;espresso&apos;
      espresso: &apos;lungo&apos;
      lungo: &apos;latte&apos;
    last:
      latte: &apos;lungo&apos;
      lungo: &apos;espresso&apos;
      espresso: &apos;cappuccino&apos;
      cappuccino: &apos;latte&apos;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;
Switch/Change States&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;coffeescript language-coffeescript&quot;&gt;@coffeeMachine.power.currentState() #=&gt; &quot;off&quot;
@coffeeMachine.power.switch(&apos;turnOn&apos;)
@coffeeMachine.power.currentState() #=&gt; &quot;on&quot;

@coffeeMachine.mode.currentState() #=&gt; &quot;latte&quot;
@coffeeMachine.mode.change(&apos;next&apos;, 3)
@coffeeMachine.mode.currentState() #=&gt; &quot;cappuccino&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;
Observers&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;coffeescript language-coffeescript&quot;&gt;@coffeeMachine.power.observeBefore(&apos;turnOn&apos;).start &apos;labelA&apos;, (from, to) =&gt; &quot;Observer A before switching to #{to.toUpperCase()}&quot;
@coffeeMachine.power.observeOn( &apos;turnOn&apos;).start &apos;labelB&apos;, (from, to) =&gt; &quot;Observer B on switching to #{to.toUpperCase()}&quot;
@coffeeMachine.power.observeAfter( &apos;turnOn&apos;).start &apos;labelC&apos;, (from, to) =&gt; &quot;Observer C after switching to #{to.toUpperCase()}&quot;

@coffeeMachine.power.observeBefore(&apos;turnOn&apos;).stop(&apos;labelA&apos;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
Go check out the &lt;a href=&quot;https://github.com/fredwu/skinny-coffee-machine&quot;&gt;source code&lt;/a&gt; now! :)&lt;/p&gt;
]]&gt;</content>
    <published>2012-09-06T11:47:00.000000Z</published>
    <category label="Blog" scheme="http://persumi.com/u/fredwu/tech/e/blog" term="blog"/>
    <category label="Tech" scheme="http://persumi.com/u/fredwu/tech" term="tech"/>
    <link href="http://persumi.com/u/fredwu/tech/e/blog/p/skinny-coffee-machine-a-simple-state-machine-with-observers"/>
    <author>
      <name>Fred Wu</name>
      <email>ifredwu@gmail.com</email>
      <uri>http://persumi.com/u/fredwu</uri>
    </author>
    <id>http://persumi.com/u/fredwu/tech/e/blog/p/skinny-coffee-machine-a-simple-state-machine-with-observers</id>
    <title>Skinny Coffee Machine - A Simple State Machine with Observers</title>
    <updated>2012-09-06T11:47:00.000000Z</updated>
  </entry>
</feed>