You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Has any thought been given to abstracting over the input type? I'm thinking specifically of binary inputs like Array[Byte], fs2.Chunk, scodec.bits.ByteVector, or java.nio.ByteBuffer. I'm struggling to compete with an HTTP/1 parser that works on Array[Byte].
The obvious answer is scodec. The old fs2-http parser built on it, while beautiful, is also much slower. I'm dreaming of a scodec with the cats-parse mutability trick.
I spiked on it a bit. Problems I encountered:
To remain compatible, we have to do unspeakable things with the String and Char based parsers when the underlying type is binary. If we added binary parsers, we'd have to do unspeakable things when the underlying type is characters.
Some desired types, like BitVector, are Long-indexed instead of Int. This ripples at least into State and Expectation.
A typeclass for inputs seems the right way, but maintaining compatibility gets even harder.
All of this could be overcome with a parallel BinParser and BinParser0, but the duplication is an awful shame. It might not even be the same library anymore.
A more modest abstraction is to accept CharSequence as input, at which point we can wrap binary inputs with something like Netty's AsciiString. It's still abusive with respect to Char vs. Byte. It also doesn't help with HTTP/2, where we might benefit from a BitVector.
This is probably all a terrible idea, but I thought I'd ask.
The text was updated successfully, but these errors were encountered:
Can we abstract beyond String (e.g. CharSequence or even a generic type). I think we can, but I assume this may cost in performance (due to loss of inlining) and possibly break compatibility
I could imagine a way to be mostly if not entirely source code compatible by doing something like having
abstractclassParserModule {
typeInputprotecteddef ... // all the core Input related code here// all current implementation hereclassParser0[A] {
....
}
classParser[A] extendsParser0[A] {
...
}
objectParser {
...
}
}
packagecatsobjectparseextendsParserModule {
typeInput=Stringdef ... // implement some string specific code here
}
If we did this, and could get the tests to compile without any changes and performance within a few percent, I think it would be worth publishing a new version 0.4.x that breaks binary compatibility.
Has any thought been given to abstracting over the input type? I'm thinking specifically of binary inputs like
Array[Byte]
,fs2.Chunk
,scodec.bits.ByteVector
, orjava.nio.ByteBuffer
. I'm struggling to compete with an HTTP/1 parser that works onArray[Byte]
.The obvious answer is scodec. The old fs2-http parser built on it, while beautiful, is also much slower. I'm dreaming of a scodec with the cats-parse mutability trick.
I spiked on it a bit. Problems I encountered:
String
andChar
based parsers when the underlying type is binary. If we added binary parsers, we'd have to do unspeakable things when the underlying type is characters.BitVector
, areLong
-indexed instead ofInt
. This ripples at least intoState
andExpectation
.BinParser
andBinParser0
, but the duplication is an awful shame. It might not even be the same library anymore.A more modest abstraction is to accept
CharSequence
as input, at which point we can wrap binary inputs with something like Netty'sAsciiString
. It's still abusive with respect toChar
vs.Byte
. It also doesn't help with HTTP/2, where we might benefit from aBitVector
.This is probably all a terrible idea, but I thought I'd ask.
The text was updated successfully, but these errors were encountered: