def VariableLengthSequence()

in multiset_codec/codecs.py [0:0]


def VariableLengthSequence(symbol_codec: Codec, max_seq_length: int) -> Codec:
    '''
    Encodes a variable-length sequence by sequentially encoding symbols with the
    symbol_codec, followed by encoding the size of the sequence.
    '''
    sequence_codec = Sequence(symbol_codec)
    seq_length_codec = substack(Uniform(max_seq_length+1), lambda h: h[:1])

    def encode(ans_state, sequence, *context):
        (ans_state, *context) = \
                sequence_codec.encode(ans_state, reversed(sequence), *context)
        (ans_state,) = seq_length_codec.encode(ans_state, len(sequence))
        return (ans_state, *context)

    def decode(ans_state, *context):
        (ans_state, seq_length) = seq_length_codec.decode(ans_state)
        (ans_state, sequence, *context) = \
                sequence_codec.decode(ans_state, seq_length[0], *context)
        return (ans_state, sequence, *context)

    return Codec(encode, decode)