packages feed

cacophony-0.6.0: examples/echo-client/Parse.hs

{-# LANGUAGE OverloadedStrings #-}
module Parse where

import Data.Attoparsec.ByteString (Parser, IResult(..), anyWord8, take, parseWith)
import Data.Bits                  ((.|.), shiftL)
import Data.ByteString            (ByteString)
import Data.IORef
import Data.Maybe                 (fromMaybe)
import Data.Monoid                ((<>))
import Network.Simple.TCP         (Socket, recv)
import Prelude hiding             (take)

messageParser :: Parser ByteString
messageParser = do
  l0 <- fromIntegral <$> anyWord8
  l1 <- fromIntegral <$> anyWord8
  take (l0 `shiftL` 8 .|. l1)

parseSocket :: IORef ByteString -> Socket -> Parser a -> IO (Maybe a)
parseSocket bufRef sock p = do
  buf <- readIORef bufRef
  result <- parseWith (fromMaybe "" <$> recv sock 2048) p buf
  case result of
    Fail{} -> return Nothing
    (Partial _)  -> return Nothing
    (Done i r)   -> modifyIORef' bufRef (<> i) >> return (Just r)