Okey, I played around with pipes-attoparsec a bit and I think I understand 
it. I will try solve this myself! (would appriciate responses, it's always 
good to see others solutions, but I will not look at mailing list till 
either I'm done or if I don't manage to figure it out since I think I'll 
learn more by trying myself).

Thanks, Karl-Oskar "klrr" Rikås

On Thursday, February 27, 2014 5:02:15 PM UTC+1, Karl-Oskar Rikås wrote:
>
> Okey, I tried pipes back 3.0 but did not understand much and moved on. Now 
> I got (a bit) more experience and thought I could try this out again. I'm 
> writing a IRC bot. So, I got some question regarding this; I have a 
> Producer that yields ByteString for each line my bot receives to a Pipe 
> which yields Message which is the internal format I deal with IRC messages. 
> I've got a bit confused about how to do this though, and it feels like 
> there's a more streaming way of doing this. So here's my code so far:
>
> import Pipes
> import Pipes.Network.TCP.Safe
> import Data.Monoid ((<>))
> import qualified Data.ByteString.Char8 as B
> import Control.Monad (forever)
>
> import Tob.IRC.Types (Message(..))
> import Tob.IRC.Decode (decodeIrc)
>
> server :: (MonadSafe m, Base m ~ IO) => HostName -> ServiceName -> 
> Producer' ByteString m ()
> server s p = fromConnect 4096 s p >~ go
>     go chunk = do
>       let (line, rest) = B.breakSubstring "\r\n" chunk
>         notDone = do
>           more <- await
>           if B.null more
>              then error "received null"
>              else parser $ chunk <> more
>       bs <- await
>       if B.null rest
>         then notDone
>         else yield $ line <> take 2 rest
>       getDone = do
>         more <- await
>         if B.null more
>           then return ()
>           else go $ chunk
>
> parser :: Pipe ByteString Message IO r
> parser = forever $ do
>   bs <- await
>   case decodeIrc bs of
>     Just m -> yield m
>     _ -> putStrLn $ "failed to parse: " ++ show bs
>
> (wrote on my phone, so haven't tried if it compiles but it will get an 
> general idea of how my design is intended)
>
> So I basically wait till I got a full bytestring till I yield it to next 
> pipe, then I parse using my parser that rely on the attoparsec parser that 
> is wrapped in maybeResult.
>
> So what I wonder:
>
> * Is this really a streaming way of doing it?
> * Is there perhaps a way to use the attoparsec parser as a Pipe in a 
> better fashion? (what happens when something Fail or Partial results?)
>
> Thanks, Karl-Oskar "klrr" Rikås
>

-- 
You received this message because you are subscribed to the Google Groups 
"Haskell Pipes" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].

Reply via email to