Conduit
をバイナリファイルを読み込み、正しいヘッダーがあることを確認して、ファイル内の残りのデータを処理する設定に使用したいと考えています。ファイルヘッダーを確認するコンジット
ヘッダーをチェックして残りのデータを次のコンジットに流すコンジットを作成しようとすると、問題が発生します。私はそれらをある例外処理のためにEither String
モナドに住まわせる。
import Conduit (ConduitM, mapC, mapM_C, takeWhileCE)
import Data.ByteString.Conversion (toByteString')
separator :: ByteString
separator = toByteString' '#'
check :: ByteString -> Either String()
confirmHeader :: ConduitM ByteString ByteString (Either String)()
confirmHeader = do
takeWhileC (/= separator) .| mapM_C check
mapC id
separator
は、ヘッダの終わりを事前に定義されたByteString
次のとおりです。ここでは、コード(私はCondiut.Attoparsec
モジュールがあります認識してんだけど、今のところ、私はそれを自分で書きたいのですが)の簡易版です。行mapC id
は、ヘッダーがチェックアウトされた場合、残りのストリームを渡すことになっています。私はcheck
の重要でない部分を省いた。
ヘッダーをチェックする部分が機能します。しかし、最後の行は、控えめで非慣用的であることを除けば、機能しません。
runConduit $ yield (toByteString' "header#rest") .| confirmHeader .| sinkList
のようなものを実行すると、私が期待したようにRight []
ではなくRight ["rest"]
与えます。何か案は?
グレート!小さな詳細として、代わりにtakeWhileCEを選択しましたが、Conduit.Binaryに対してベンチマークを行います。 – jorgen
'takeWhileCE'はうまくいくはずです:私は実際にそれを使いたいと思っていましたが、その名前とConduit.Binaryを忘れていました。 –
ちなみに、あなたは 'mapC id'よりももっとエレガントなものを考えることができますか、それともその標準ですか? – jorgen