module Language.Haskell.Liquid.RTick
(
Tick(..)
, fmap
, pure
, (<*>)
, liftA2
, return
, (>>=)
, (=<<)
, eqBind
, leqBind
, geqBind
, ap
, liftM
, liftM2
, step
, wait
, waitN
, go
, goN
, wmap
, wmapN
, gmap
, gmapN
, (</>)
, (<//>)
, (<\>)
, (<\\>)
, (>/=)
, (=/<)
, (>//=)
, (=//<)
, (>\=)
, (=\<)
, (>\\=)
, (=\\<)
, pay
, zipWithM
) where
import Prelude hiding ( Functor(..), Applicative(..), Monad(..), (=<<) )
import qualified Control.Applicative as A
import qualified Control.Monad as M
import qualified Data.Functor as F
data Tick a = Tick { Tick a -> Int
tcost :: Int, Tick a -> a
tval :: a }
instance F.Functor Tick where
fmap :: (a -> b) -> Tick a -> Tick b
fmap = (a -> b) -> Tick a -> Tick b
forall a b. (a -> b) -> Tick a -> Tick b
fmap
fmap :: (a -> b) -> Tick a -> Tick b
fmap :: (a -> b) -> Tick a -> Tick b
fmap a -> b
f (Tick Int
m a
x) = Int -> b -> Tick b
forall a. Int -> a -> Tick a
Tick Int
m (a -> b
f a
x)
instance A.Applicative Tick where
pure :: a -> Tick a
pure = a -> Tick a
forall a. a -> Tick a
pure
<*> :: Tick (a -> b) -> Tick a -> Tick b
(<*>) = Tick (a -> b) -> Tick a -> Tick b
forall a b. Tick (a -> b) -> Tick a -> Tick b
(<*>)
pure :: a -> Tick a
pure :: a -> Tick a
pure a
x = Int -> a -> Tick a
forall a. Int -> a -> Tick a
Tick Int
0 a
x
infixl 4 <*>
(<*>) :: Tick (a -> b) -> Tick a -> Tick b
Tick Int
m a -> b
f <*> :: Tick (a -> b) -> Tick a -> Tick b
<*> Tick Int
n a
x = Int -> b -> Tick b
forall a. Int -> a -> Tick a
Tick (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n) (a -> b
f a
x)
liftA2 :: (a -> b -> c) -> Tick a -> Tick b -> Tick c
liftA2 :: (a -> b -> c) -> Tick a -> Tick b -> Tick c
liftA2 a -> b -> c
f (Tick Int
m a
x) (Tick Int
n b
y) = Int -> c -> Tick c
forall a. Int -> a -> Tick a
Tick (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n) (a -> b -> c
f a
x b
y)
instance M.Monad Tick where
return :: a -> Tick a
return = a -> Tick a
forall a. a -> Tick a
return
>>= :: Tick a -> (a -> Tick b) -> Tick b
(>>=) = Tick a -> (a -> Tick b) -> Tick b
forall a b. Tick a -> (a -> Tick b) -> Tick b
(>>=)
return :: a -> Tick a
return :: a -> Tick a
return a
x = Int -> a -> Tick a
forall a. Int -> a -> Tick a
Tick Int
0 a
x
infixl 4 >>=
(>>=) :: Tick a -> (a -> Tick b) -> Tick b
Tick Int
m a
x >>= :: Tick a -> (a -> Tick b) -> Tick b
>>= a -> Tick b
f = let Tick Int
n b
y = a -> Tick b
f a
x in Int -> b -> Tick b
forall a. Int -> a -> Tick a
Tick (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n) b
y
infixl 4 =<<
(=<<) :: (a -> Tick b) -> Tick a -> Tick b
a -> Tick b
f =<< :: (a -> Tick b) -> Tick a -> Tick b
=<< Tick Int
m a
x = let Tick Int
n b
y = a -> Tick b
f a
x in Int -> b -> Tick b
forall a. Int -> a -> Tick a
Tick (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n) b
y
ap :: Tick (a -> b) -> Tick a -> Tick b
ap :: Tick (a -> b) -> Tick a -> Tick b
ap (Tick Int
m a -> b
f) (Tick Int
n a
x) = Int -> b -> Tick b
forall a. Int -> a -> Tick a
Tick (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n) (a -> b
f a
x)
liftM :: (a -> b) -> Tick a -> Tick b
liftM :: (a -> b) -> Tick a -> Tick b
liftM a -> b
f (Tick Int
m a
x) = Int -> b -> Tick b
forall a. Int -> a -> Tick a
Tick Int
m (a -> b
f a
x)
liftM2 :: (a -> b -> c) -> Tick a -> Tick b -> Tick c
liftM2 :: (a -> b -> c) -> Tick a -> Tick b -> Tick c
liftM2 a -> b -> c
f (Tick Int
m a
x) (Tick Int
n b
y) = Int -> c -> Tick c
forall a. Int -> a -> Tick a
Tick (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n) (a -> b -> c
f a
x b
y)
eqBind :: Int -> Tick a -> (a -> Tick b) -> Tick b
eqBind :: Int -> Tick a -> (a -> Tick b) -> Tick b
eqBind Int
_ (Tick Int
m a
x) a -> Tick b
f = let Tick Int
n b
y = a -> Tick b
f a
x in Int -> b -> Tick b
forall a. Int -> a -> Tick a
Tick (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n) b
y
leqBind :: Int -> Tick a -> (a -> Tick b) -> Tick b
leqBind :: Int -> Tick a -> (a -> Tick b) -> Tick b
leqBind Int
_ (Tick Int
m a
x) a -> Tick b
f = let Tick Int
n b
y = a -> Tick b
f a
x in Int -> b -> Tick b
forall a. Int -> a -> Tick a
Tick (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n) b
y
geqBind :: Int -> Tick a -> (a -> Tick b) -> Tick b
geqBind :: Int -> Tick a -> (a -> Tick b) -> Tick b
geqBind Int
_ (Tick Int
m a
x) a -> Tick b
f = let Tick Int
n b
y = a -> Tick b
f a
x in Int -> b -> Tick b
forall a. Int -> a -> Tick a
Tick (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n) b
y
step :: Int -> Tick a -> Tick a
step :: Int -> Tick a -> Tick a
step Int
m (Tick Int
n a
x) = Int -> a -> Tick a
forall a. Int -> a -> Tick a
Tick (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n) a
x
wait :: a -> Tick a
wait :: a -> Tick a
wait a
x = Int -> a -> Tick a
forall a. Int -> a -> Tick a
Tick Int
1 a
x
waitN :: Int -> a -> Tick a
waitN :: Int -> a -> Tick a
waitN Int
n a
x = Int -> a -> Tick a
forall a. Int -> a -> Tick a
Tick Int
n a
x
go :: a -> Tick a
go :: a -> Tick a
go a
x = Int -> a -> Tick a
forall a. Int -> a -> Tick a
Tick (-Int
1) a
x
goN :: Int -> a -> Tick a
goN :: Int -> a -> Tick a
goN Int
n a
x = Int -> a -> Tick a
forall a. Int -> a -> Tick a
Tick (-Int
n) a
x
wmap :: (a -> b) -> Tick a -> Tick b
wmap :: (a -> b) -> Tick a -> Tick b
wmap a -> b
f (Tick Int
m a
x) = Int -> b -> Tick b
forall a. Int -> a -> Tick a
Tick (Int
1 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
m) (a -> b
f a
x)
wmapN :: Int -> (a -> b) -> Tick a -> Tick b
wmapN :: Int -> (a -> b) -> Tick a -> Tick b
wmapN Int
m a -> b
f (Tick Int
n a
x) = Int -> b -> Tick b
forall a. Int -> a -> Tick a
Tick (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n) (a -> b
f a
x)
gmap :: (a -> b) -> Tick a -> Tick b
gmap :: (a -> b) -> Tick a -> Tick b
gmap a -> b
f (Tick Int
m a
x) = Int -> b -> Tick b
forall a. Int -> a -> Tick a
Tick (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) (a -> b
f a
x)
gmapN :: Int -> (a -> b) -> Tick a -> Tick b
gmapN :: Int -> (a -> b) -> Tick a -> Tick b
gmapN Int
m a -> b
f (Tick Int
n a
x) = Int -> b -> Tick b
forall a. Int -> a -> Tick a
Tick (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
m) (a -> b
f a
x)
infixl 4 </>
(</>) :: Tick (a -> b) -> Tick a -> Tick b
Tick Int
m a -> b
f </> :: Tick (a -> b) -> Tick a -> Tick b
</> Tick Int
n a
x = Int -> b -> Tick b
forall a. Int -> a -> Tick a
Tick (Int
1 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n) (a -> b
f a
x)
infixl 4 <//>
(<//>) :: Tick (a -> b) -> Tick a -> Tick b
Tick Int
m a -> b
f <//> :: Tick (a -> b) -> Tick a -> Tick b
<//> Tick Int
n a
x = Int -> b -> Tick b
forall a. Int -> a -> Tick a
Tick (Int
2 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n) (a -> b
f a
x)
infixl 4 <\>
(<\>) :: Tick (a -> b) -> Tick a -> Tick b
Tick Int
m a -> b
f <\> :: Tick (a -> b) -> Tick a -> Tick b
<\> Tick Int
n a
x = Int -> b -> Tick b
forall a. Int -> a -> Tick a
Tick (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) (a -> b
f a
x)
infixl 4 <\\>
(<\\>) :: Tick (a -> b) -> Tick a -> Tick b
Tick Int
m a -> b
f <\\> :: Tick (a -> b) -> Tick a -> Tick b
<\\> Tick Int
n a
x = Int -> b -> Tick b
forall a. Int -> a -> Tick a
Tick (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
2) (a -> b
f a
x)
infixl 4 >/=
(>/=) :: Tick a -> (a -> Tick b) -> Tick b
Tick Int
m a
x >/= :: Tick a -> (a -> Tick b) -> Tick b
>/= a -> Tick b
f = let Tick Int
n b
y = a -> Tick b
f a
x in Int -> b -> Tick b
forall a. Int -> a -> Tick a
Tick (Int
1 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n) b
y
infixl 4 =/<
(=/<) :: (a -> Tick b) -> Tick a -> Tick b
a -> Tick b
f =/< :: (a -> Tick b) -> Tick a -> Tick b
=/< Tick Int
m a
x = let Tick Int
n b
y = a -> Tick b
f a
x in Int -> b -> Tick b
forall a. Int -> a -> Tick a
Tick (Int
1 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n) b
y
infixl 4 >//=
(>//=) :: Tick a -> (a -> Tick b) -> Tick b
Tick Int
m a
x >//= :: Tick a -> (a -> Tick b) -> Tick b
>//= a -> Tick b
f = let Tick Int
n b
y = a -> Tick b
f a
x in Int -> b -> Tick b
forall a. Int -> a -> Tick a
Tick (Int
2 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n) b
y
infixl 4 =//<
(=//<) :: (a -> Tick b) -> Tick a -> Tick b
a -> Tick b
f =//< :: (a -> Tick b) -> Tick a -> Tick b
=//< Tick Int
m a
x = let Tick Int
n b
y = a -> Tick b
f a
x in Int -> b -> Tick b
forall a. Int -> a -> Tick a
Tick (Int
2 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n) b
y
infixl 4 >\=
(>\=) :: Tick a -> (a -> Tick b) -> Tick b
Tick Int
m a
x >\= :: Tick a -> (a -> Tick b) -> Tick b
>\= a -> Tick b
f = let Tick Int
n b
y = a -> Tick b
f a
x in Int -> b -> Tick b
forall a. Int -> a -> Tick a
Tick (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) b
y
infixl 4 =\<
(=\<) :: (a -> Tick b) -> Tick a -> Tick b
a -> Tick b
f =\< :: (a -> Tick b) -> Tick a -> Tick b
=\< Tick Int
m a
x = let Tick Int
n b
y = a -> Tick b
f a
x in Int -> b -> Tick b
forall a. Int -> a -> Tick a
Tick (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) b
y
infixl 4 >\\=
(>\\=) :: Tick a -> (a -> Tick b) -> Tick b
Tick Int
m a
x >\\= :: Tick a -> (a -> Tick b) -> Tick b
>\\= a -> Tick b
f = let Tick Int
n b
y = a -> Tick b
f a
x in Int -> b -> Tick b
forall a. Int -> a -> Tick a
Tick (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
2) b
y
infixl 4 =\\<
(=\\<) :: (a -> Tick b) -> Tick a -> Tick b
a -> Tick b
f =\\< :: (a -> Tick b) -> Tick a -> Tick b
=\\< Tick Int
m a
x = let Tick Int
n b
y = a -> Tick b
f a
x in Int -> b -> Tick b
forall a. Int -> a -> Tick a
Tick (Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
2) b
y
pay :: Int -> Tick a -> Tick (Tick a)
pay :: Int -> Tick a -> Tick (Tick a)
pay Int
m (Tick Int
n a
x) = Int -> Tick a -> Tick (Tick a)
forall a. Int -> a -> Tick a
Tick Int
m (Int -> a -> Tick a
forall a. Int -> a -> Tick a
Tick (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
m) a
x)
zipWithM :: (a -> b -> Tick c) -> Tick a -> Tick b -> Tick c
zipWithM :: (a -> b -> Tick c) -> Tick a -> Tick b -> Tick c
zipWithM a -> b -> Tick c
f (Tick Int
c1 a
x1) (Tick Int
c2 b
x2) = let Tick Int
c c
x = a -> b -> Tick c
f a
x1 b
x2 in Int -> c -> Tick c
forall a. Int -> a -> Tick a
Tick (Int
c Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
c1 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
c2) c
x