packages feed

packed-data-0.2.0.0: examples/Traversal.hs

{-# LANGUAGE BangPatterns #-}

module Traversal () where

import Data.Packed
import Data.Packed.Reader
import qualified Data.Packed.Reader as R
import Tree

$(mkPacked ''Tree [])

myTree :: Tree Int
myTree = Node (Leaf 1) (Leaf 2)

packedTree :: Packed '[Tree Int]
packedTree = pack myTree

-- The two following functions do the same thing

sumPacked1 :: PackedReader '[Tree Int] r Int
sumPacked1 =
    caseTree
        ( R.do
            !n <- reader
            R.return n
        )
        ( R.do
            !left <- sumPacked1
            !right <- sumPacked1
            let !res = left + right
            R.return res
        )

sumPacked2 :: PackedReader '[Tree Int] r Int
sumPacked2 = PackedReader $ \case
    PackedLeaf l -> reader `with` l
    PackedNode n -> threadedWith n $ R.do
        !left <- sumPacked2
        !right <- sumPacked2
        let !res = left + right
        R.return res

runSum :: Int
runSum = fst $ runReader sumPacked1 packedTree