{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}

module Wrap0 () where


import Language.Haskell.Liquid.Prelude (liquidError, liquidAssertB)
import Data.Function (on)
import Data.Ord (comparing)

data WrapType b a = WrapType {getVect :: b, getVal :: a}

instance Eq (WrapType [Double] a) where
   (==) = (==) `on` getVect

instance Ord (WrapType [Double] a) where
    compare = comparing getVect

{-@ assert flibXs :: a -> Bool @-}
flibXs x              = prop1 (WrapType [x, x, x] x)
prop1 (WrapType [] _) = liquidError "no!"
prop1 (WrapType _  _) = True

{-@ assert nflibXs :: Int -> a -> Bool @-}
nflibXs n x           = prop2 n (WrapType nxs x)
                        where nxs = replicate n x 

prop2 n (WrapType xs _) = liquidAssertB (n > length xs) 





