{-# LANGUAGE DerivingStrategies #-}
module Parsley.Internal.Backend.Machine.Types.Coins (
Coins(..),
int, zero,
minCoins, maxCoins,
plus1, plus, minus,
plusNotReclaim,
) where
data Coins = Coins {
Coins -> Int
willConsume :: Int,
Coins -> Int
canReclaim :: Int
} deriving stock Int -> Coins -> ShowS
[Coins] -> ShowS
Coins -> String
(Int -> Coins -> ShowS)
-> (Coins -> String) -> ([Coins] -> ShowS) -> Show Coins
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Coins] -> ShowS
$cshowList :: [Coins] -> ShowS
show :: Coins -> String
$cshow :: Coins -> String
showsPrec :: Int -> Coins -> ShowS
$cshowsPrec :: Int -> Coins -> ShowS
Show
int :: Int -> Coins
int :: Int -> Coins
int Int
n = Int -> Int -> Coins
Coins Int
n Int
n
zero :: Coins
zero :: Coins
zero = Int -> Coins
int Int
0
zipCoins :: (Int -> Int -> Int) -> Coins -> Coins -> Coins
zipCoins :: (Int -> Int -> Int) -> Coins -> Coins -> Coins
zipCoins Int -> Int -> Int
f (Coins Int
k1 Int
r1) (Coins Int
k2 Int
r2) = Int -> Int -> Coins
Coins (Int -> Int -> Int
f Int
k1 Int
k2) (Int -> Int -> Int
f Int
r1 Int
r2)
minCoins :: Coins -> Coins -> Coins
minCoins :: Coins -> Coins -> Coins
minCoins = (Int -> Int -> Int) -> Coins -> Coins -> Coins
zipCoins Int -> Int -> Int
forall a. Ord a => a -> a -> a
min
maxCoins :: Coins -> Coins -> Coins
maxCoins :: Coins -> Coins -> Coins
maxCoins = (Int -> Int -> Int) -> Coins -> Coins -> Coins
zipCoins Int -> Int -> Int
forall a. Ord a => a -> a -> a
max
plus1 :: Coins -> Coins
plus1 :: Coins -> Coins
plus1 = Coins -> Coins -> Coins
plus (Int -> Int -> Coins
Coins Int
1 Int
1)
plus :: Coins -> Coins -> Coins
plus :: Coins -> Coins -> Coins
plus = (Int -> Int -> Int) -> Coins -> Coins -> Coins
zipCoins Int -> Int -> Int
forall a. Num a => a -> a -> a
(+)
minus :: Coins -> Coins -> Coins
minus :: Coins -> Coins -> Coins
minus = (Int -> Int -> Int) -> Coins -> Coins -> Coins
zipCoins (-)
plusNotReclaim :: Coins -> Int -> Coins
plusNotReclaim :: Coins -> Int -> Coins
plusNotReclaim (Coins Int
k Int
r) Int
n = Int -> Int -> Coins
Coins (Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n) Int
r