module Glazier.Pipes.Strict where

import Control.Monad.State.Strict
import qualified Glazier.Strict as G
import qualified Pipes as P
import Control.Lens

-- | Converts a Gadget into a Pipe
gadgetToPipe :: (Monad m, MonadTrans t, MonadState s (t m)) => G.Gadget s m a c -> P.Pipe a c (t m) r
gadgetToPipe g = forever $ do
    a <- P.await
    s <- get
    (c, s') <- lift . lift $ view G._GadgetT g a s
    put s'
    P.yield c