, , piso :: Iso' a b -> Iso' (Producer a m r) (Producer b m r)
import Control.Applicative
import Control.Lens (view, from, zoom, iso, Iso')
import Control.Monad.State.Strict (evalState)
import Pipes
import Pipes.Core as Pc
import qualified Pipes.Parse as Pp
import qualified Pipes.Prelude as P
newtype A = A Int
deriving Show
newtype B = B Int
deriving Show
atob (A i) = B i
btoa (B i) = A i
ab :: Iso' A B
ab = iso atob btoa
piso :: Monad m => Iso' a b -> Iso' (Producer a m r) (Producer b m r)
piso i = iso (P.map (view i) <-<) (>-> P.map (view $ from i))
main :: IO ()
main = do
let src = P.map atob <-< P.map A <-< each [1..10]
let parser = (,,) <$> zoom (Pp.splitAt 1) Pp.peek
<*> zoom (Pp.splitAt 3 . piso (from ab)) Pp.drawAll
<*> Pp.drawAll
let res = evalState parser src
print res
src Producer B m r parser a Parser B m (Maybe B, [A], [B]). , , - , parser -State bound Producer . , zoom, , Producer, .
, zoom (piso (from ab) . Pp.splitAt 3) Pp.drawAll, , , Producer . A B.
view (Pp.splitAt 3 . piso (from ab))
:: Monad m => Producer B m x -> (Producer A m (Producer B m x))
-- note that only the outer, first Producer has been mapped over, the protected,
-- inner producer in the return type is isolated from `piso` effect
view (piso (from ab) . Pp.splitAt 3)
:: Monad m => Producer B m x -> (Producer A m (Producer A m x))