packages feed

compdata-dags-0.2: examples/Examples/Types.hs

{-# LANGUAGE DeriveFoldable     #-}
{-# LANGUAGE DeriveFunctor      #-}
{-# LANGUAGE DeriveTraversable  #-}
{-# LANGUAGE TemplateHaskell    #-}
{-# LANGUAGE FlexibleContexts   #-}

module Examples.Types where


import Data.Comp.Term
import Data.Comp.Dag
import Data.Comp.Derive
import System.IO.Unsafe



data IntTreeF a = Leaf Int | Node a a
  deriving (Eq, Show, Functor, Foldable, Traversable)

$(derive [smartConstructors, makeShowF, makeEqF] [''IntTreeF])


-- Example terms and dags

it1 :: Term IntTreeF
it1 = iNode (iNode x (iLeaf 10)) x
    where x = iNode y y
          y = iLeaf 20

i1 :: Dag IntTreeF
i1 = unsafePerformIO $ reifyDag it1

--     [ (0, Node 1 2)
--     , (1, Node 2 3)
--     , (2, Node 4 4)
--     , (3, Leaf 10)
--     , (4, Leaf 20)
--     ]


it2 :: Term IntTreeF
it2 = iNode x (iNode (iLeaf 5) x)
    where x = iNode (iNode (iLeaf 24) (iLeaf 3)) (iLeaf 4)

i2 :: Dag IntTreeF
i2 = unsafePerformIO $ reifyDag it2

--     [ (0, Node 2 1)
--     , (1, Node 4 2)
--     , (2, Node 3 5)
--     , (3, Node 6 7)
--     , (4, Leaf 5)
--     , (5, Leaf 4)
--     , (6, Leaf 24)
--     , (7, Leaf 3)
--     ]