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
    -- TODO Add `Fail` case
    Done _ _ a    -> MachineT . return $ Yield a stopped
    decA'         -> processDecoder decA'