~divmod-dev/divmod.org/dangling-1091

« back to all changes in this revision

Viewing changes to Vertex/vertex/statemachine.py

  • Committer: glyph
  • Date: 2005-08-04 20:40:55 UTC
  • Revision ID: svn-v4:866e43f7-fbfc-0310-8f2a-ec88d1da2979:trunk:20
yay internet

new q2q stuff

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- test-case-name: vertex.test.test_statemachine -*-
 
2
 
 
3
NOTHING = 'nothing'             # be quiet (no output)
 
4
 
 
5
class StateMachine:
 
6
 
 
7
    initialState = None         # a str describing initial state
 
8
 
 
9
    states = None     # dict, mapping state to dict of str input: (str output,
 
10
                      # str new-state)
 
11
 
 
12
 
 
13
    def __init__(self, initialState=None):
 
14
        if initialState is None:
 
15
            initialState = self.initialState
 
16
        self.state = self.initialState
 
17
 
 
18
    def transition(self, oldstate, newstate, datum, *a, **kw):
 
19
        exitmeth = getattr(self, 'exit_%s' % (oldstate,), None)
 
20
        entermeth = getattr(self, 'enter_%s' % (newstate,), None)
 
21
        transmeth = getattr(self, 'transition_%s_to_%s' % (
 
22
                oldstate.upper(), newstate.upper()), None)
 
23
        for meth in exitmeth, entermeth, transmeth:
 
24
            if meth is not None:
 
25
                meth(*a, **kw)
 
26
        self.state = newstate
 
27
 
 
28
    def input(self, datum, *a, **kw):
 
29
        oldstate = self.state
 
30
        if datum == NOTHING:
 
31
            return
 
32
        output, newstate = self.states[self.state][datum]
 
33
        OLDSTATE = self.state
 
34
        NEWSTATE = newstate.upper()
 
35
        DATUM = datum.upper()
 
36
        self.transition(OLDSTATE, NEWSTATE, DATUM, *a, **kw)
 
37
        self.output(output, *a, **kw)
 
38
 
 
39
    def output(self, datum, *a, **kw):
 
40
        foo = getattr(self, 'output_' + datum.upper(), None)
 
41
        if foo is not None:
 
42
            foo(*a, **kw)