Здравствуйте.
Есть такой код:
{-# LANGUAGE OverloadedStrings #-}
import Data.Conduit
import Conduit
import Control.Concurrent.Async
import Data.Conduit.Network
import Data.Conduit.Binary as DCB
import Data.Conduit.List as DCL
import Data.ByteString.Char8 as B
hostnameListen = "127.0.0.1"
main :: IO ()
main =
runTCPServer (serverSettings 4003 hostnameListen) $ \server ->
appSource server $= DCB.lines $= condToInt $= condToBS $$ appSink server
condToInt :: Conduit ByteString IO Int
condToInt = awaitForever $ \bs -> do
let res = B.readInt bs
case res of
Nothing -> yield 0
Just (x, _) -> yield x
condToBS :: Conduit Int IO ByteString
condToBS = awaitForever $ \i -> do
let result = B.pack . show $ i
yield result
condMultiplN :: Int -> Conduit Int IO Int
condMultiplN m = awaitForever $ \i ->
yield $ i * m
Ломаю голову над следующим: как сделать так, чтобы в
appSource server $= DCB.lines $= condToInt $= condToBS $$ appSink server
Поясню подробнее.
main :: IO ()
main =
runTCPServer (serverSettings 4003 hostnameListen) $ \server -> do
(resum1, res) <- appSource server $= DCB.lines $$+ condToInt
case (odd res) of
True -> resum1 $$+- condMultiplN 2 =$ condToBS $$ appSink server
otherwise -> resum1 $$+- condMultiplN 3 =$ condToBS $$ appSink server
Я знаю, что показанный код нерабочий, ибо
($$+) :: Monad m => Source m a -> Sink a m b -> m (ResumableSource m a, b)
Вопрос: как этого добиться?