I posted this to stack overflow 
<https://stackoverflow.com/questions/49246763/adapting-store-decoding-for-streaming-library>
 
in case anyone might be able to help answer it there. The problem that I am 
trying to solve is how to adapt the following decoding API from Store 
<https://www.stackage.org/haddock/lts-10.9/store-0.4.3.2/Data-Store-Streaming.html>
 
to `Streaming` library:
decodeMessageBS :: (MonadIO 
<https://www.stackage.org/haddock/lts-10.9/foundation-0.0.17/Foundation-Monad.html#t:MonadIO>
 
m, Store 
<https://www.stackage.org/haddock/lts-10.9/store-0.4.3.2/Data-Store-Internal.html#t:Store>
 
a) => ByteBuffer 
<https://www.stackage.org/haddock/lts-10.9/store-0.4.3.2/System-IO-ByteBuffer.html#t:ByteBuffer>
 
-> m (Maybe 
<https://www.stackage.org/haddock/lts-10.9/basement-0.0.4/Basement-Compat-Base.html#t:Maybe>
 
ByteString 
<https://www.stackage.org/haddock/lts-10.9/bytestring-0.10.8.2/Data-ByteString.html#t:ByteString>
) -> m (Maybe 
<https://www.stackage.org/haddock/lts-10.9/basement-0.0.4/Basement-Compat-Base.html#t:Maybe>
 
(Message 
<https://www.stackage.org/haddock/lts-10.9/store-0.4.3.2/Data-Store-Streaming.html#t:Message>
 
a))

I took a shot at it with the code below but am not able to figure it out 
yet - there are some undefined statements in the code below btw as 
placeholders - perhaps, there also exists a simpler and efficient way to 
adapt `decodeMessageBS` to `Streaming`:

{-# LANGUAGE OverloadedStrings,ScopedTypeVariables #-}import           
Data.ByteString (ByteString)import           System.IO.ByteBuffer 
(ByteBuffer)import qualified System.IO.ByteBuffer as BBimport 
Data.Store.Streamingimport Data.Store (Store)import Streaming.Prelude as 
Simport Data.IORef

streamDecodeH :: forall a r. (Store a) => ByteBuffer -> Stream (Of ByteString) 
IO r -> Stream (Of (Message a)) IO r
streamDecodeH bb inp = do
    ref <- newIORef inp 
    go (popper ref)
    undefined
  where
    go src = do
      r <- (decodeMessageBS :: ByteBuffer -> IO (Maybe ByteString) -> IO (Maybe 
(Message a))) bb src
      case r of 
        Nothing -> undefined
        Just msg -> (S.yield :: Message a -> Stream (Of (Message a)) IO ()) msg 
>> go src

    popper :: IORef (Stream (Of ByteString) IO r) -> IO (Maybe ByteString)
    popper ref = do
      chunks <- readIORef ref
      r <- S.uncons chunks
      case r of
        Nothing -> return Nothing
        Just (a,rest) -> writeIORef ref rest >> return (Just a)


Will appreciate help with it, either here or at StackOverflow.

-- 
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 haskell-pipes+unsubscr...@googlegroups.com.
To post to this group, send email to haskell-pipes@googlegroups.com.

Reply via email to