{-# OPTIONS -fglasgow-exts #-}

module Rules where

{-# RULES
"transform/transform" forall (f::forall m. Monoid m => (a -> m) -> (b -> m))
                             (g::forall m. Monoid m => (b -> m) -> (c -> m))
                             (l::[Int]). transform f (transform g  l) = transform (g.f) l
   #-}


class Monoid m where {}

upto :: Int -> [Int]
upto n = [1..n]
  
foo = transform (. (*2)) (transform (. (+1)) (upto 10))

bar = mapK (*20) (mapK (+40) (upto 100))


{-# INLINE mapK #-}
mapK g x = transform (. g) x

{-# NOINLINE transform #-}
transform :: (forall m. Monoid m => (a -> m) -> (b -> m)) -> [Int] -> [Int]
transform = error "urk"

