module Hydra.Tx.DepositPeriod where
import Hydra.Prelude hiding (Show, show)
import Hydra.Data.DepositPeriod qualified as OnChain
import Text.Show (Show (..))
newtype DepositPeriod = DepositPeriod {DepositPeriod -> NominalDiffTime
toNominalDiffTime :: NominalDiffTime}
deriving stock (DepositPeriod -> DepositPeriod -> Bool
(DepositPeriod -> DepositPeriod -> Bool)
-> (DepositPeriod -> DepositPeriod -> Bool) -> Eq DepositPeriod
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: DepositPeriod -> DepositPeriod -> Bool
== :: DepositPeriod -> DepositPeriod -> Bool
$c/= :: DepositPeriod -> DepositPeriod -> Bool
/= :: DepositPeriod -> DepositPeriod -> Bool
Eq, Eq DepositPeriod
Eq DepositPeriod =>
(DepositPeriod -> DepositPeriod -> Ordering)
-> (DepositPeriod -> DepositPeriod -> Bool)
-> (DepositPeriod -> DepositPeriod -> Bool)
-> (DepositPeriod -> DepositPeriod -> Bool)
-> (DepositPeriod -> DepositPeriod -> Bool)
-> (DepositPeriod -> DepositPeriod -> DepositPeriod)
-> (DepositPeriod -> DepositPeriod -> DepositPeriod)
-> Ord DepositPeriod
DepositPeriod -> DepositPeriod -> Bool
DepositPeriod -> DepositPeriod -> Ordering
DepositPeriod -> DepositPeriod -> DepositPeriod
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: DepositPeriod -> DepositPeriod -> Ordering
compare :: DepositPeriod -> DepositPeriod -> Ordering
$c< :: DepositPeriod -> DepositPeriod -> Bool
< :: DepositPeriod -> DepositPeriod -> Bool
$c<= :: DepositPeriod -> DepositPeriod -> Bool
<= :: DepositPeriod -> DepositPeriod -> Bool
$c> :: DepositPeriod -> DepositPeriod -> Bool
> :: DepositPeriod -> DepositPeriod -> Bool
$c>= :: DepositPeriod -> DepositPeriod -> Bool
>= :: DepositPeriod -> DepositPeriod -> Bool
$cmax :: DepositPeriod -> DepositPeriod -> DepositPeriod
max :: DepositPeriod -> DepositPeriod -> DepositPeriod
$cmin :: DepositPeriod -> DepositPeriod -> DepositPeriod
min :: DepositPeriod -> DepositPeriod -> DepositPeriod
Ord, (forall x. DepositPeriod -> Rep DepositPeriod x)
-> (forall x. Rep DepositPeriod x -> DepositPeriod)
-> Generic DepositPeriod
forall x. Rep DepositPeriod x -> DepositPeriod
forall x. DepositPeriod -> Rep DepositPeriod x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. DepositPeriod -> Rep DepositPeriod x
from :: forall x. DepositPeriod -> Rep DepositPeriod x
$cto :: forall x. Rep DepositPeriod x -> DepositPeriod
to :: forall x. Rep DepositPeriod x -> DepositPeriod
Generic)
deriving newtype (ReadPrec [DepositPeriod]
ReadPrec DepositPeriod
Int -> ReadS DepositPeriod
ReadS [DepositPeriod]
(Int -> ReadS DepositPeriod)
-> ReadS [DepositPeriod]
-> ReadPrec DepositPeriod
-> ReadPrec [DepositPeriod]
-> Read DepositPeriod
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS DepositPeriod
readsPrec :: Int -> ReadS DepositPeriod
$creadList :: ReadS [DepositPeriod]
readList :: ReadS [DepositPeriod]
$creadPrec :: ReadPrec DepositPeriod
readPrec :: ReadPrec DepositPeriod
$creadListPrec :: ReadPrec [DepositPeriod]
readListPrec :: ReadPrec [DepositPeriod]
Read, Integer -> DepositPeriod
DepositPeriod -> DepositPeriod
DepositPeriod -> DepositPeriod -> DepositPeriod
(DepositPeriod -> DepositPeriod -> DepositPeriod)
-> (DepositPeriod -> DepositPeriod -> DepositPeriod)
-> (DepositPeriod -> DepositPeriod -> DepositPeriod)
-> (DepositPeriod -> DepositPeriod)
-> (DepositPeriod -> DepositPeriod)
-> (DepositPeriod -> DepositPeriod)
-> (Integer -> DepositPeriod)
-> Num DepositPeriod
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
$c+ :: DepositPeriod -> DepositPeriod -> DepositPeriod
+ :: DepositPeriod -> DepositPeriod -> DepositPeriod
$c- :: DepositPeriod -> DepositPeriod -> DepositPeriod
- :: DepositPeriod -> DepositPeriod -> DepositPeriod
$c* :: DepositPeriod -> DepositPeriod -> DepositPeriod
* :: DepositPeriod -> DepositPeriod -> DepositPeriod
$cnegate :: DepositPeriod -> DepositPeriod
negate :: DepositPeriod -> DepositPeriod
$cabs :: DepositPeriod -> DepositPeriod
abs :: DepositPeriod -> DepositPeriod
$csignum :: DepositPeriod -> DepositPeriod
signum :: DepositPeriod -> DepositPeriod
$cfromInteger :: Integer -> DepositPeriod
fromInteger :: Integer -> DepositPeriod
Num, Num DepositPeriod
Ord DepositPeriod
(Num DepositPeriod, Ord DepositPeriod) =>
(DepositPeriod -> Rational) -> Real DepositPeriod
DepositPeriod -> Rational
forall a. (Num a, Ord a) => (a -> Rational) -> Real a
$ctoRational :: DepositPeriod -> Rational
toRational :: DepositPeriod -> Rational
Real, [DepositPeriod] -> Value
[DepositPeriod] -> Encoding
DepositPeriod -> Bool
DepositPeriod -> Value
DepositPeriod -> Encoding
(DepositPeriod -> Value)
-> (DepositPeriod -> Encoding)
-> ([DepositPeriod] -> Value)
-> ([DepositPeriod] -> Encoding)
-> (DepositPeriod -> Bool)
-> ToJSON DepositPeriod
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: DepositPeriod -> Value
toJSON :: DepositPeriod -> Value
$ctoEncoding :: DepositPeriod -> Encoding
toEncoding :: DepositPeriod -> Encoding
$ctoJSONList :: [DepositPeriod] -> Value
toJSONList :: [DepositPeriod] -> Value
$ctoEncodingList :: [DepositPeriod] -> Encoding
toEncodingList :: [DepositPeriod] -> Encoding
$comitField :: DepositPeriod -> Bool
omitField :: DepositPeriod -> Bool
ToJSON, Maybe DepositPeriod
Value -> Parser [DepositPeriod]
Value -> Parser DepositPeriod
(Value -> Parser DepositPeriod)
-> (Value -> Parser [DepositPeriod])
-> Maybe DepositPeriod
-> FromJSON DepositPeriod
forall a.
(Value -> Parser a)
-> (Value -> Parser [a]) -> Maybe a -> FromJSON a
$cparseJSON :: Value -> Parser DepositPeriod
parseJSON :: Value -> Parser DepositPeriod
$cparseJSONList :: Value -> Parser [DepositPeriod]
parseJSONList :: Value -> Parser [DepositPeriod]
$comittedField :: Maybe DepositPeriod
omittedField :: Maybe DepositPeriod
FromJSON)
instance ToCBOR DepositPeriod where
toCBOR :: DepositPeriod -> Encoding
toCBOR = DepositPeriod -> Encoding
forall a. (Generic a, GToCBOR (Rep a)) => a -> Encoding
genericToCBOR
instance FromCBOR DepositPeriod where
fromCBOR :: forall s. Decoder s DepositPeriod
fromCBOR = Decoder s DepositPeriod
forall a s. (Generic a, GFromCBOR (Rep a)) => Decoder s a
genericFromCBOR
instance Show DepositPeriod where
show :: DepositPeriod -> String
show (DepositPeriod NominalDiffTime
dt) = Integer -> String
forall a. Show a => a -> String
show (NominalDiffTime -> Integer
forall b. Integral b => NominalDiffTime -> b
forall a b. (RealFrac a, Integral b) => a -> b
round NominalDiffTime
dt :: Integer) String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
"s"
fromNominalDiffTime :: MonadFail m => NominalDiffTime -> m DepositPeriod
fromNominalDiffTime :: forall (m :: * -> *).
MonadFail m =>
NominalDiffTime -> m DepositPeriod
fromNominalDiffTime NominalDiffTime
dt
| NominalDiffTime
dt NominalDiffTime -> NominalDiffTime -> Bool
forall a. Ord a => a -> a -> Bool
< NominalDiffTime
0 =
String -> m DepositPeriod
forall a. String -> m a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> m DepositPeriod) -> String -> m DepositPeriod
forall a b. (a -> b) -> a -> b
$ String
"fromNominalDiffTime: deposit period < 0: " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> NominalDiffTime -> String
forall a. Show a => a -> String
show NominalDiffTime
dt
| DepositPeriod -> NominalDiffTime
OnChain.depositPeriodToDiffTime (NominalDiffTime -> DepositPeriod
OnChain.depositPeriodFromDiffTime NominalDiffTime
dt) NominalDiffTime -> NominalDiffTime -> Bool
forall a. Eq a => a -> a -> Bool
/= NominalDiffTime
dt =
String -> m DepositPeriod
forall a. String -> m a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> m DepositPeriod) -> String -> m DepositPeriod
forall a b. (a -> b) -> a -> b
$ String
"fromNominalDiffTime: deposit period is not a whole number of milliseconds: " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> NominalDiffTime -> String
forall a. Show a => a -> String
show NominalDiffTime
dt
| Bool
otherwise = DepositPeriod -> m DepositPeriod
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (DepositPeriod -> m DepositPeriod)
-> DepositPeriod -> m DepositPeriod
forall a b. (a -> b) -> a -> b
$ NominalDiffTime -> DepositPeriod
DepositPeriod NominalDiffTime
dt
toChain :: DepositPeriod -> OnChain.DepositPeriod
toChain :: DepositPeriod -> DepositPeriod
toChain (DepositPeriod NominalDiffTime
dt) = NominalDiffTime -> DepositPeriod
OnChain.depositPeriodFromDiffTime NominalDiffTime
dt
fromChain :: OnChain.DepositPeriod -> Either Text DepositPeriod
fromChain :: DepositPeriod -> Either Text DepositPeriod
fromChain DepositPeriod
dp
| NominalDiffTime
dt NominalDiffTime -> NominalDiffTime -> Bool
forall a. Ord a => a -> a -> Bool
>= NominalDiffTime
0 = DepositPeriod -> Either Text DepositPeriod
forall a b. b -> Either a b
Right (DepositPeriod -> Either Text DepositPeriod)
-> DepositPeriod -> Either Text DepositPeriod
forall a b. (a -> b) -> a -> b
$ NominalDiffTime -> DepositPeriod
DepositPeriod NominalDiffTime
dt
| Bool
otherwise = Text -> Either Text DepositPeriod
forall a b. a -> Either a b
Left (Text -> Either Text DepositPeriod)
-> Text -> Either Text DepositPeriod
forall a b. (a -> b) -> a -> b
$ Text
"deposit period is negative: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
forall a. ToText a => a -> Text
toText (Integer -> String
forall a. Show a => a -> String
show (DiffMilliSeconds -> Integer
forall a. Integral a => a -> Integer
toInteger (DepositPeriod -> DiffMilliSeconds
OnChain.milliseconds DepositPeriod
dp))) Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"ms"
where
dt :: NominalDiffTime
dt = DepositPeriod -> NominalDiffTime
OnChain.depositPeriodToDiffTime DepositPeriod
dp