packages feed

hermit-0.7.0.0: examples/flatten/Flatten.hec

load-as-rewrite "WWA" "WW-Ass-A.hss"
define-rewrite "WWC" "ww-result-AssA-to-AssC WWA"
load-as-rewrite "StrictRepH" "StrictRepH.hss"

-- module main:Main where
--   flatten :: forall a . Tree a -> [a]
--   $dShow :: Show [Char]
--   main :: IO ()
--   main :: IO ()

binding-of 'flatten

-- flatten = \ * ds ->
--   case ds of wild *
--     Node l r -> (++) * (flatten * l) (flatten * r)
--     Leaf a -> (:) * a ([] *)

ww-result-split-static-arg 1 [0] [| absH |] [| repH |] WWC

-- flatten = \ * ds ->
--   (let f = \ flatten' ds ->
--          case ds of wild *
--            Node l r -> (++) * (flatten' l) (flatten' r)
--            Leaf a -> (:) * a ([] *)
--        rec work = \ x1 -> repH * (f (\ x2 -> absH * (work x2)) x1)
--    in \ x0 -> absH * (work x0)) ds

bash
{

-- flatten = \ * ->
--   let rec work = \ x1 ->
--             repH *
--                  (case x1 of wild *
--                     Node l r -> (++) * (absH * (work l)) (absH * (work r))
--                     Leaf a -> (:) * a ([] *))
--   in \ x0 -> absH * (work x0)

rhs-of 'work

-- \ x1 ->
--   repH *
--        (case x1 of wild *
--           Node l r -> (++) * (absH * (work l)) (absH * (work r))
--           Leaf a -> (:) * a ([] *))

alpha-lam 'tree

-- \ tree ->
--   repH *
--        (case tree of wild *
--           Node l r -> (++) * (absH * (work l)) (absH * (work r))
--           Leaf a -> (:) * a ([] *))

lam-body

-- repH *
--      (case tree of wild *
--         Node l r -> (++) * (absH * (work l)) (absH * (work r))
--         Leaf a -> (:) * a ([] *))

eta-expand 'acc

-- \ acc ->
--   repH *
--        (case tree of wild *
--           Node l r -> (++) * (absH * (work l)) (absH * (work r))
--           Leaf a -> (:) * a ([] *))
--        acc

lam-body

-- repH *
--      (case tree of wild *
--         Node l r -> (++) * (absH * (work l)) (absH * (work r))
--         Leaf a -> (:) * a ([] *))
--      acc

bash-extended-with [push 'repH StrictRepH,forward ww-result-fusion,unfold-rules-unsafe ["repH ++","repH (:)","repH []"]]

-- case tree of wild *
--   Node l r -> work l (work r acc)
--   Leaf a -> (:) * a acc

 }

-- flatten = \ * ->
--   let rec work = \ tree acc ->
--             case tree of wild *
--               Node l r -> work l (work r acc)
--               Leaf a -> (:) * a acc
--   in \ x0 -> absH * (work x0)

one-td (unfold 'absH)

-- flatten = \ * ->
--   let rec work = \ tree acc ->
--             case tree of wild *
--               Node l r -> work l (work r acc)
--               Leaf a -> (:) * a acc
--   in \ x0 -> work x0 ([] *)