packages feed

hermit-0.7.0.0: examples/new_reverse/HList.hs

module HList
    ( H
    , repH
    , absH
    , myAppend
    ) where

type H a = [a] -> [a]

{-# INLINABLE repH #-}
repH :: [a] -> H a
repH xs = (xs ++)

{-# INLINABLE absH #-}
absH :: H a -> [a]
absH f = f []

-- Because we can't get unfolding for ++
myAppend :: [a] -> [a] -> [a]
myAppend []     ys = ys
myAppend (x:xs) ys = x : myAppend xs ys
{-# RULES "appendFix" [~] (++) = myAppend #-}

-- Algebra for repH
{-# RULES "repH []"  [~]               repH [] = id #-}
{-# RULES "repH (:)" [~] forall x xs.  repH (x:xs) = (x:) . repH xs #-}
{-# RULES "repH ++"  [~] forall xs ys. repH (xs ++ ys) = repH xs . repH ys #-}

-- Needed because the fusion rule we generate isn't too useful yet.
{-# RULES "repH-absH-fusion" [~] forall h. repH (absH h) = h #-}