module TestRec where

import Prelude hiding (map, foldl)

data L a = N | C a (L a)
{-@ 
data L [llen] a = N | C (x::a) (xs::(L a))
  @-}

{-@ measure llen :: (L a) -> Int
    llen(N) = 0
    llen(C x xs) = 1 + (llen xs)
  @-}


{-@map :: (a -> b) -> [a] -> [b]@-}
map f []     = []
map f (x:xs) = f x : map f xs
 
bar = map id [1, 2]

{-@ Decrease go 2 @-}
rev xs = go [] xs
  where go ack  []    = ack
        go ack (x:xs) = go (x:ack) xs

{-@ invariant {v:(L a) | ((llen v) >= 0)}@-}

mapL f N = N
mapL f (C x xs) = C (f x) (mapL f xs)


foldl f z [] = z
foldl f z (x:xs) = x `f` foldl f z xs

