ByteByByteFrameParser.kt
package io.github.tritbool.euc.ble.frames
/**
* Parser that calls a functional unpacker with each byte.
* The unpacker must maintain its internal state and return 0..N complete frames
* on each feed(byte) call.
*/
class ByteByByteFrameParser(
private val unpacker: (b: Byte) -> List<ByteArray>,
private val resetUnpacker: (() -> Unit)? = null
) : FrameParser {
override fun appendAndExtract(data: ByteArray): List<ByteArray> {
val out = mutableListOf<ByteArray>()
for (b in data) {
val frames = unpacker(b)
if (frames.isNotEmpty()) out.addAll(frames)
}
return out
}
override fun reset() {
resetUnpacker?.invoke()
}
}