{-# LANGUAGE MagicHash #-}
module Language.Haskell.Liquid.Prelude where
{-# NOINLINE plus #-}
plus :: Int -> Int -> Int
plus :: Int -> Int -> Int
plus Int
x Int
y = Int
x Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
y
{-# NOINLINE minus #-}
minus :: Int -> Int -> Int
minus :: Int -> Int -> Int
minus Int
x Int
y = Int
x Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
y
{-# NOINLINE times #-}
times :: Int -> Int -> Int
times :: Int -> Int -> Int
times Int
x Int
y = Int
x Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
y
{-# NOINLINE eq #-}
eq :: Int -> Int -> Bool
eq :: Int -> Int -> Bool
eq Int
x Int
y = Int
x Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
y
{-# NOINLINE neq #-}
neq :: Int -> Int -> Bool
neq :: Int -> Int -> Bool
neq Int
x Int
y = Bool -> Bool
not (Int
x Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
y)
{-# NOINLINE leq #-}
leq :: Int -> Int -> Bool
leq :: Int -> Int -> Bool
leq Int
x Int
y = Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
y
{-# NOINLINE geq #-}
geq :: Int -> Int -> Bool
geq :: Int -> Int -> Bool
geq Int
x Int
y = Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
y
{-# NOINLINE lt #-}
lt :: Int -> Int -> Bool
lt :: Int -> Int -> Bool
lt Int
x Int
y = Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
y
{-# NOINLINE gt #-}
gt :: Int -> Int -> Bool
gt :: Int -> Int -> Bool
gt Int
x Int
y = Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
y
{-# NOINLINE liquidAssertB #-}
liquidAssertB :: Bool -> Bool
liquidAssertB :: Bool -> Bool
liquidAssertB Bool
b = Bool
b
{-# NOINLINE liquidAssert #-}
liquidAssert :: Bool -> a -> a
liquidAssert :: Bool -> a -> a
liquidAssert Bool
_ a
x = a
x
{-# NOINLINE liquidAssume #-}
liquidAssume :: Bool -> a -> a
liquidAssume :: Bool -> a -> a
liquidAssume Bool
b a
x = if Bool
b then a
x else [Char] -> a
forall a. HasCallStack => [Char] -> a
error [Char]
"liquidAssume fails"
liquidAssumeB :: (a -> Bool) -> a -> a
liquidAssumeB :: (a -> Bool) -> a -> a
liquidAssumeB a -> Bool
p a
x | a -> Bool
p a
x = a
x
| Bool
otherwise = [Char] -> a
forall a. HasCallStack => [Char] -> a
error [Char]
"liquidAssumeB fails"
{-# NOINLINE unsafeError #-}
unsafeError :: String -> a
unsafeError :: [Char] -> a
unsafeError = [Char] -> a
forall a. HasCallStack => [Char] -> a
error
{-# NOINLINE liquidError #-}
liquidError :: String -> a
liquidError :: [Char] -> a
liquidError = [Char] -> a
forall a. HasCallStack => [Char] -> a
error
{-# NOINLINE crash #-}
crash :: Bool -> a
crash :: Bool -> a
crash = Bool -> a
forall a. HasCallStack => a
undefined
{-# NOINLINE force #-}
force :: Bool
force :: Bool
force = Bool
True
{-# NOINLINE choose #-}
choose :: Int -> Int
choose :: Int -> Int
choose = Int -> Int
forall a. HasCallStack => a
undefined
{-# NOINLINE isEven #-}
isEven :: Int -> Bool
isEven :: Int -> Bool
isEven Int
x = Int
x Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
2 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0
{-# NOINLINE isOdd #-}
isOdd :: Int -> Bool
isOdd :: Int -> Bool
isOdd Int
x = Int
x Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
2 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
1
safeZipWith :: (a->b->c) -> [a]->[b]->[c]
safeZipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
safeZipWith a -> b -> c
f (a
a:[a]
as) (b
b:[b]
bs) = a -> b -> c
f a
a b
b c -> [c] -> [c]
forall a. a -> [a] -> [a]
: (a -> b -> c) -> [a] -> [b] -> [c]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
safeZipWith a -> b -> c
f [a]
as [b]
bs
safeZipWith a -> b -> c
_ [] [] = []
safeZipWith a -> b -> c
_ [a]
_ [b]
_ = [Char] -> [c]
forall a. HasCallStack => [Char] -> a
error [Char]
"safeZipWith: cannot happen!"
infixr 8 ==>
(==>) :: Bool -> Bool -> Bool
Bool
False ==> :: Bool -> Bool -> Bool
==> Bool
False = Bool
True
Bool
False ==> Bool
True = Bool
True
Bool
True ==> Bool
True = Bool
True
Bool
True ==> Bool
False = Bool
False