span
と以外のケースで pipes-parse 3.0 がどのように機能するかを理解しようとしていますsplitAt
が、うまく機能させる方法がわかりません。基本的な考え方は、私には同型性があり、すべての入力値をマップして type から type に変換したいということA
ですB
。B
次に、すべての残り物を からに戻したいと思いA
ます。でこれをどのように達成しpipes-parse
ますか?
比較のために、コードは次のようになりますconduit
。
import Control.Applicative ((<$>), (<*>))
import Data.Conduit (yield, ($$), (=$=))
import Data.Conduit.Extra (fuseLeftovers)
import qualified Data.Conduit.List as CL
newtype A = A Int
deriving Show
newtype B = B Int
deriving Show
atob (A i) = (B i)
btoa (B i) = (A i)
main :: IO ()
main = do
let src = mapM_ (yield . A) [1..10]
res <- src $$ (,,,)
<$> fuseLeftovers (map btoa) (CL.map atob) CL.peek
<*> CL.take 3
<*> (CL.map atob =$= CL.take 3)
<*> CL.consume
print res
編集:明確にするために、上記のコードの出力は次のとおりです。
(Just (B 1),[A 1,A 2,A 3],[B 4,B 5,B 6],[A 7,A 8,A 9,A 10])
元のストリームのタイプは であることに注意してくださいA
。最初の要素に変換しB
てピークし、次の 3 つの要素を type としてA
取得し、次の 3 つを としてB
取得し、最後に残りを として取得しA
ます。