from obj import *
from defensive import *

log = Logging('fsm')

@immutable
class State(object):
    def __init__(self,name,transitionDict={},default=None):
        self.name = name
        self.transitionLst = tuple(transitionDict.items())
        self.default = default if default else self

    @log.debug
    def nextState(self,suite={}):
        for (predicate,state) in self.transitionLst:
            if predicate():
                return suite[state]
        return suite[self.default]

if __name__ == '__main__':
    import datetime
    begin = datetime.datetime.now()
    
    def after(T):
        begin = datetime.datetime.now().second
        end = begin+T
        def closure():
            now = datetime.datetime.now().second
            return now == end
        return closure
    
    def inp():
        return raw_input('pres q to quit')=='q'
        
    suite={
        'A':State('A',{after(5):'B',after(10):'C'},'A'),
        'B':State('B',{},'A'),
        'C':State('C',{inp:'D'},'C'),
        'D':State('D',{},'D')
    }
    
    state = suite['A']
    while state!=suite['D']:
        print state.name
        state=state.nextState(suite)
    print 'the end'
