# -*- python -*-

"""null-framer: separates frames using NUL characters.
"""

from dp2.util import clone
from dp2.ghostutil import pass_, puke
from dp2.corpora import Presentation, Path
from dp2.predicates import is_presentation
from dp2.ghosts import PredicateGhost

name = 'f0'

def encode(p):
    return Presentation(actor=Path(inverse[p.target.head], p.actor),
                        object=p.object+'\000',
                        target=p.target.tail)

def decode(p):
    target = p.target.tail
    actor = Path(inverse[p.target.head], p.actor)
    buffer = p.object
    if buffers.has_key(target):
        buffer = buffers[target] + buffer
    inputs = buffer.split('\000')
    buffers[target] = inputs[-1]
    return map(lambda s: Presentation(actor=actor, target=target, object=s),
               inputs[:-1])

buffers = {}

def transcoder(transcode):
    def _(aff):
        if is_presentation(aff):
            return transcode(aff)
        else:
            return clone(aff, actor=Path(inverse[aff.target.head], aff.actor),
                              target=aff.target.tail)
    return _

encode = transcoder(encode)
decode = transcoder(decode)

inverse = {encode: decode,
           decode: encode}
