| 139 | ################################################################################ |
| 140 | |
| 141 | class _Processor(object): |
| 142 | |
| 143 | slots('key, into, index, from') |
| 144 | |
| 145 | def __init__(self, key, primer): |
| 146 | if self.__class__ is _Processor: |
| 147 | raise NotImplementedError('This is an abstract class!') |
| 148 | key.test_primer(primer) |
| 149 | self.__key = key |
| 150 | self.__into = table = dict(map(reversed, enumerate(key.order))) |
| 151 | self.__index = collections.deque(map(table.__getitem__, primer.data)) |
| 152 | self.__index.appendleft(None) |
| 153 | self.__from = dict(map(reversed, table.items())) |
| 154 | |
| 155 | def process(self, data): |
| 156 | cache = [] |
| 157 | self._run(data, cache.append, self.__key, self.__into, self.__index) |
| 158 | return ''.join(cache) |
| 159 | |
| 160 | @staticmethod |
| 161 | def _run(data, cache_push, key, table, index): |
| 162 | raise NotImplementedError('This is an abstract method!') |
| 163 | |
| 164 | @property |
| 165 | def primer(self): |
| 166 | self.__index.popleft() |
| 167 | value = Primer(''.join(map(self.__from.__getitem__, self.__index))) |
| 168 | self.__index.appendleft(None) |
| 169 | return value |
| 170 | |
| 171 | ################################################################################ |
| 172 | |