packed-data-0.2.0.0: examples/Increment.hs
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
-- | Showcase how to 'mutate' packed data
module Increment (incrementRunner) where
import Data.Packed
import Data.Packed.Needs
import qualified Data.Packed.Needs as N
import qualified Data.Packed.Reader as R
import Tree
$(mkPacked ''Tree [])
incrementRunner :: Packed '[Tree Int] -> Packed '[Tree Int]
incrementRunner p = runBuilder . fst $ runReader incrementPacked p
-- -- The workhouse of the incrementation
incrementPacked :: PackedReader '[Tree Int] r (NeedsBuilder (Tree Int ': r1) '[Tree Int] r1 '[Tree Int])
incrementPacked =
transformTree
( R.do
n <- reader
R.return (write (n + 1))
)
( R.do
left <- incrementPacked
right <- incrementPacked
R.return (\needs -> left needs N.>>= right)
)