module Range (prop_rng5, myfoldl) where

import Language.Haskell.Liquid.Prelude

{-@ invariant {v:Int| v >= 0} @-}

range :: Int -> Int -> [Int]
range i j = range' (j - i) i j

range' :: Int -> Int -> Int -> [Int]
range' d i j  
  | i < j     = i : (range' (d-1) (i + 1) j)
  | otherwise = []  


sumTo = foldl (+) 0 . range 0 

{-@ decrease lgo 2 @-}
--myfoldl :: (Int -> Int -> Int) -> Int -> [Int] -> Int
myfoldl f z0 xs0 = lgo z0 xs0
             where
                lgo z []     =  z
                lgo z (x:xs) = lgo (f z x) xs
n = choose 0 
m = choose 1

-- prop_rng1 = map (liquidAssertB . (0 <=)) $ range 0 n
-- prop_rng2 = map (liquidAssertB . (n <=)) $ range n 100
-- prop_rng3 = map (liquidAssertB . (n <=)) $ range n m
-- prop_rng4 = map (liquidAssertB . (<= m)) $ range n m 
prop_rng5 = liquidAssertB (0 <= sumTo n)
