Commit 8879c752 authored by Thibault VINCENT's avatar Thibault VINCENT
Browse files

add: two enum emulations

parent d867fe5d
Loading
Loading
Loading
Loading
+82 −0
Original line number Diff line number Diff line
@@ -2,6 +2,88 @@

from threading import Lock

def enum(*sequential, **named):
    '''
    '''
    enums = dict(zip(sequential, range(len(sequential))), **named)
    return type('Enum', (), enums)


class Enum(dict):
    '''
    Usage example:
    
    $ states = Enum(SLEEPING, CONNECTED="Conn", DISCONNECTED="Disco")
    $ print states.CONNECTED
    1
    $ states.SLEEPING
    0
    $ states.CONNECTED_str
    "Conn"
    $ states.SLEEPING_str
    None
    $ 0 in states
    True
    $ 10 in states
    False
    $ s = "Conn"
    $ if s in states:
    $     val = states[s]
    '''
    def __init__(self, *named, **valued):
        '''
        '''
        # FIXME not memory optimal structures
        self._items_map = {}
        self._items_rmap = {}
        self._items_val = []
        toks = [(name, None) for name in named]
        toks.extend([i for i in valued.iteritems()])
        for key, tok in enumerate(toks):
            self._items_map[tok[0]] = key
            self._items_rmap[key] = tok[0]
            self._items_val.append(tok[1])
    
    def __contains__(self, item):
        '''
        '''
        if isinstance(item, int):
            return item in self._items_rmap
        else:
            return item in self._items_val
    
    def __getitem__(self, key):
        '''
        '''
        if isinstance(key, int):
            return self._items_val[key]
        else:
            for idx, val in enumerate(self._items_val):
                if val == key:
                    return idx
            raise IndexError('object not found in enum')
    
    def __getattr__(self, name):
        '''
        '''
        if name in self._items_map:
            return self._items_map[name]
        else:
            if name[-4:] == '_str':
                n = name[:3]
                if n in self._items_map:
                    return self._items_val[self._items_map[n]]
        raise AttributeError('not an enum member')

    def get(self, key, default=None):
        '''
        '''
        try:
            return self[key]
        except IndexError as err:
            return default


class RWLock(object):
    '''
    '''