Provide buffer-agnostic interface for the Get monad.
- 主要言語
- Haskell
- スター
- 120
- フォーク
- 70
- PR マージ指標
- 30日以内にマージされた PR はありません
説明
Despite the fact that binary was primary designed with lazy bytestrins in mind, it also very useful for generic serialization with various types of buffers. And it works quite well for Put monad: we have `execPut :: PutM a -> Builder` latter we can run this builder with `runBuilder :: Builder -> BufferWriter` from `Data.ByteString.Builder.Extra` on any type of buffer: the interface requires vanilla pointer of type `Ptr Word8` and also provides information about minimal buffer size and number of bytes written to buffer. This function can be used to generate lazy bytestring, to write directly to device buffer, I use this function to write data to preallocated memory buffer in my application and then to generate strict bytestring from it.
Unfortunately similar functionality for Get monad is missed from the package. The closest function we have is `runGetIncremental :: Get a -> Decoder a` but it still operates on ByteStrings (not on pointers) and it even had serious performance issue until https://github.com/kolmodin/binary/commit/7532daa8789e5199109bb1fcde367d71effb07e2 Even been fixed, it still introduces some overhead by relatively complex handling logic, and this can be noticeable effect on very small Getters (in my application I have a getter which reads 6 bytes, even very small overhead on it affects performance).
I think Decoder should be redesigned to operate on pointers and buffer size information in similar way as `Builder` from the `Data.ByteString` does. Having such interface it would be easy to create ByteString version, as well as any custom buffer reader with minimal overhead.
コントリビューションガイド
このリポジトリのコントリビューションガイドは索引されていません
調査の方向性
まず、既存の runGetIncremental :: Get a -> Decoder a インターフェースを読み、Data.ByteString.Builder.Extra の execPut、Builder、runBuilder と比較します。完了条件は、Decoder がポインタとバッファサイズ情報を扱え、ByteString の実装とカスタムバッファリーダーをより少ないオーバーヘッドでサポートできることです。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- haskell
- 領域
- data
- issue の種類
- 機能追加
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 25/100