module Data.Binary.Get.Machine where
import Data.ByteString (ByteString)
import Data.Binary.Get (Decoder(..), Get, pushChunk, runGetIncremental)
import Data.Machine (MachineT(..), ProcessT, Step(Await, Yield), Is(Refl), stopped)
processGet :: Monad m => Get a -> ProcessT m ByteString a
processGet getA = processDecoder (runGetIncremental getA)
processDecoder :: Monad m => Decoder a -> ProcessT m ByteString a
processDecoder decA = MachineT . return $ Await f Refl stopped where
f xs = case pushChunk decA xs of
Done _ _ a -> MachineT . return $ Yield a stopped
decA' -> processDecoder decA'