module Hydra.Node.ApiTransactionTimeout where

import Hydra.Prelude

import Test.QuickCheck (choose)

-- | A new type wrapped period of time to be used in API transaction timeout.
newtype ApiTransactionTimeout = ApiTransactionTimeout
  { ApiTransactionTimeout -> NominalDiffTime
apiTransactionTimeoutNominalDiffTime :: NominalDiffTime
  }
  deriving stock (ApiTransactionTimeout -> ApiTransactionTimeout -> Bool
(ApiTransactionTimeout -> ApiTransactionTimeout -> Bool)
-> (ApiTransactionTimeout -> ApiTransactionTimeout -> Bool)
-> Eq ApiTransactionTimeout
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ApiTransactionTimeout -> ApiTransactionTimeout -> Bool
== :: ApiTransactionTimeout -> ApiTransactionTimeout -> Bool
$c/= :: ApiTransactionTimeout -> ApiTransactionTimeout -> Bool
/= :: ApiTransactionTimeout -> ApiTransactionTimeout -> Bool
Eq, Eq ApiTransactionTimeout
Eq ApiTransactionTimeout =>
(ApiTransactionTimeout -> ApiTransactionTimeout -> Ordering)
-> (ApiTransactionTimeout -> ApiTransactionTimeout -> Bool)
-> (ApiTransactionTimeout -> ApiTransactionTimeout -> Bool)
-> (ApiTransactionTimeout -> ApiTransactionTimeout -> Bool)
-> (ApiTransactionTimeout -> ApiTransactionTimeout -> Bool)
-> (ApiTransactionTimeout
    -> ApiTransactionTimeout -> ApiTransactionTimeout)
-> (ApiTransactionTimeout
    -> ApiTransactionTimeout -> ApiTransactionTimeout)
-> Ord ApiTransactionTimeout
ApiTransactionTimeout -> ApiTransactionTimeout -> Bool
ApiTransactionTimeout -> ApiTransactionTimeout -> Ordering
ApiTransactionTimeout
-> ApiTransactionTimeout -> ApiTransactionTimeout
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 :: ApiTransactionTimeout -> ApiTransactionTimeout -> Ordering
compare :: ApiTransactionTimeout -> ApiTransactionTimeout -> Ordering
$c< :: ApiTransactionTimeout -> ApiTransactionTimeout -> Bool
< :: ApiTransactionTimeout -> ApiTransactionTimeout -> Bool
$c<= :: ApiTransactionTimeout -> ApiTransactionTimeout -> Bool
<= :: ApiTransactionTimeout -> ApiTransactionTimeout -> Bool
$c> :: ApiTransactionTimeout -> ApiTransactionTimeout -> Bool
> :: ApiTransactionTimeout -> ApiTransactionTimeout -> Bool
$c>= :: ApiTransactionTimeout -> ApiTransactionTimeout -> Bool
>= :: ApiTransactionTimeout -> ApiTransactionTimeout -> Bool
$cmax :: ApiTransactionTimeout
-> ApiTransactionTimeout -> ApiTransactionTimeout
max :: ApiTransactionTimeout
-> ApiTransactionTimeout -> ApiTransactionTimeout
$cmin :: ApiTransactionTimeout
-> ApiTransactionTimeout -> ApiTransactionTimeout
min :: ApiTransactionTimeout
-> ApiTransactionTimeout -> ApiTransactionTimeout
Ord)
  deriving newtype (Int -> ApiTransactionTimeout -> ShowS
[ApiTransactionTimeout] -> ShowS
ApiTransactionTimeout -> String
(Int -> ApiTransactionTimeout -> ShowS)
-> (ApiTransactionTimeout -> String)
-> ([ApiTransactionTimeout] -> ShowS)
-> Show ApiTransactionTimeout
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ApiTransactionTimeout -> ShowS
showsPrec :: Int -> ApiTransactionTimeout -> ShowS
$cshow :: ApiTransactionTimeout -> String
show :: ApiTransactionTimeout -> String
$cshowList :: [ApiTransactionTimeout] -> ShowS
showList :: [ApiTransactionTimeout] -> ShowS
Show, ReadPrec [ApiTransactionTimeout]
ReadPrec ApiTransactionTimeout
Int -> ReadS ApiTransactionTimeout
ReadS [ApiTransactionTimeout]
(Int -> ReadS ApiTransactionTimeout)
-> ReadS [ApiTransactionTimeout]
-> ReadPrec ApiTransactionTimeout
-> ReadPrec [ApiTransactionTimeout]
-> Read ApiTransactionTimeout
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS ApiTransactionTimeout
readsPrec :: Int -> ReadS ApiTransactionTimeout
$creadList :: ReadS [ApiTransactionTimeout]
readList :: ReadS [ApiTransactionTimeout]
$creadPrec :: ReadPrec ApiTransactionTimeout
readPrec :: ReadPrec ApiTransactionTimeout
$creadListPrec :: ReadPrec [ApiTransactionTimeout]
readListPrec :: ReadPrec [ApiTransactionTimeout]
Read, Integer -> ApiTransactionTimeout
ApiTransactionTimeout -> ApiTransactionTimeout
ApiTransactionTimeout
-> ApiTransactionTimeout -> ApiTransactionTimeout
(ApiTransactionTimeout
 -> ApiTransactionTimeout -> ApiTransactionTimeout)
-> (ApiTransactionTimeout
    -> ApiTransactionTimeout -> ApiTransactionTimeout)
-> (ApiTransactionTimeout
    -> ApiTransactionTimeout -> ApiTransactionTimeout)
-> (ApiTransactionTimeout -> ApiTransactionTimeout)
-> (ApiTransactionTimeout -> ApiTransactionTimeout)
-> (ApiTransactionTimeout -> ApiTransactionTimeout)
-> (Integer -> ApiTransactionTimeout)
-> Num ApiTransactionTimeout
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
$c+ :: ApiTransactionTimeout
-> ApiTransactionTimeout -> ApiTransactionTimeout
+ :: ApiTransactionTimeout
-> ApiTransactionTimeout -> ApiTransactionTimeout
$c- :: ApiTransactionTimeout
-> ApiTransactionTimeout -> ApiTransactionTimeout
- :: ApiTransactionTimeout
-> ApiTransactionTimeout -> ApiTransactionTimeout
$c* :: ApiTransactionTimeout
-> ApiTransactionTimeout -> ApiTransactionTimeout
* :: ApiTransactionTimeout
-> ApiTransactionTimeout -> ApiTransactionTimeout
$cnegate :: ApiTransactionTimeout -> ApiTransactionTimeout
negate :: ApiTransactionTimeout -> ApiTransactionTimeout
$cabs :: ApiTransactionTimeout -> ApiTransactionTimeout
abs :: ApiTransactionTimeout -> ApiTransactionTimeout
$csignum :: ApiTransactionTimeout -> ApiTransactionTimeout
signum :: ApiTransactionTimeout -> ApiTransactionTimeout
$cfromInteger :: Integer -> ApiTransactionTimeout
fromInteger :: Integer -> ApiTransactionTimeout
Num, Int -> ApiTransactionTimeout
ApiTransactionTimeout -> Int
ApiTransactionTimeout -> [ApiTransactionTimeout]
ApiTransactionTimeout -> ApiTransactionTimeout
ApiTransactionTimeout
-> ApiTransactionTimeout -> [ApiTransactionTimeout]
ApiTransactionTimeout
-> ApiTransactionTimeout
-> ApiTransactionTimeout
-> [ApiTransactionTimeout]
(ApiTransactionTimeout -> ApiTransactionTimeout)
-> (ApiTransactionTimeout -> ApiTransactionTimeout)
-> (Int -> ApiTransactionTimeout)
-> (ApiTransactionTimeout -> Int)
-> (ApiTransactionTimeout -> [ApiTransactionTimeout])
-> (ApiTransactionTimeout
    -> ApiTransactionTimeout -> [ApiTransactionTimeout])
-> (ApiTransactionTimeout
    -> ApiTransactionTimeout -> [ApiTransactionTimeout])
-> (ApiTransactionTimeout
    -> ApiTransactionTimeout
    -> ApiTransactionTimeout
    -> [ApiTransactionTimeout])
-> Enum ApiTransactionTimeout
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: ApiTransactionTimeout -> ApiTransactionTimeout
succ :: ApiTransactionTimeout -> ApiTransactionTimeout
$cpred :: ApiTransactionTimeout -> ApiTransactionTimeout
pred :: ApiTransactionTimeout -> ApiTransactionTimeout
$ctoEnum :: Int -> ApiTransactionTimeout
toEnum :: Int -> ApiTransactionTimeout
$cfromEnum :: ApiTransactionTimeout -> Int
fromEnum :: ApiTransactionTimeout -> Int
$cenumFrom :: ApiTransactionTimeout -> [ApiTransactionTimeout]
enumFrom :: ApiTransactionTimeout -> [ApiTransactionTimeout]
$cenumFromThen :: ApiTransactionTimeout
-> ApiTransactionTimeout -> [ApiTransactionTimeout]
enumFromThen :: ApiTransactionTimeout
-> ApiTransactionTimeout -> [ApiTransactionTimeout]
$cenumFromTo :: ApiTransactionTimeout
-> ApiTransactionTimeout -> [ApiTransactionTimeout]
enumFromTo :: ApiTransactionTimeout
-> ApiTransactionTimeout -> [ApiTransactionTimeout]
$cenumFromThenTo :: ApiTransactionTimeout
-> ApiTransactionTimeout
-> ApiTransactionTimeout
-> [ApiTransactionTimeout]
enumFromThenTo :: ApiTransactionTimeout
-> ApiTransactionTimeout
-> ApiTransactionTimeout
-> [ApiTransactionTimeout]
Enum, Num ApiTransactionTimeout
Ord ApiTransactionTimeout
(Num ApiTransactionTimeout, Ord ApiTransactionTimeout) =>
(ApiTransactionTimeout -> Rational) -> Real ApiTransactionTimeout
ApiTransactionTimeout -> Rational
forall a. (Num a, Ord a) => (a -> Rational) -> Real a
$ctoRational :: ApiTransactionTimeout -> Rational
toRational :: ApiTransactionTimeout -> Rational
Real, [ApiTransactionTimeout] -> Value
[ApiTransactionTimeout] -> Encoding
ApiTransactionTimeout -> Bool
ApiTransactionTimeout -> Value
ApiTransactionTimeout -> Encoding
(ApiTransactionTimeout -> Value)
-> (ApiTransactionTimeout -> Encoding)
-> ([ApiTransactionTimeout] -> Value)
-> ([ApiTransactionTimeout] -> Encoding)
-> (ApiTransactionTimeout -> Bool)
-> ToJSON ApiTransactionTimeout
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: ApiTransactionTimeout -> Value
toJSON :: ApiTransactionTimeout -> Value
$ctoEncoding :: ApiTransactionTimeout -> Encoding
toEncoding :: ApiTransactionTimeout -> Encoding
$ctoJSONList :: [ApiTransactionTimeout] -> Value
toJSONList :: [ApiTransactionTimeout] -> Value
$ctoEncodingList :: [ApiTransactionTimeout] -> Encoding
toEncodingList :: [ApiTransactionTimeout] -> Encoding
$comitField :: ApiTransactionTimeout -> Bool
omitField :: ApiTransactionTimeout -> Bool
ToJSON, Maybe ApiTransactionTimeout
Value -> Parser [ApiTransactionTimeout]
Value -> Parser ApiTransactionTimeout
(Value -> Parser ApiTransactionTimeout)
-> (Value -> Parser [ApiTransactionTimeout])
-> Maybe ApiTransactionTimeout
-> FromJSON ApiTransactionTimeout
forall a.
(Value -> Parser a)
-> (Value -> Parser [a]) -> Maybe a -> FromJSON a
$cparseJSON :: Value -> Parser ApiTransactionTimeout
parseJSON :: Value -> Parser ApiTransactionTimeout
$cparseJSONList :: Value -> Parser [ApiTransactionTimeout]
parseJSONList :: Value -> Parser [ApiTransactionTimeout]
$comittedField :: Maybe ApiTransactionTimeout
omittedField :: Maybe ApiTransactionTimeout
FromJSON)

-- | Truncates to whole seconds.
instance Integral ApiTransactionTimeout where
  quotRem :: ApiTransactionTimeout
-> ApiTransactionTimeout
-> (ApiTransactionTimeout, ApiTransactionTimeout)
quotRem (ApiTransactionTimeout NominalDiffTime
a) (ApiTransactionTimeout NominalDiffTime
b) = (NominalDiffTime -> ApiTransactionTimeout
ApiTransactionTimeout (NominalDiffTime -> ApiTransactionTimeout)
-> NominalDiffTime -> ApiTransactionTimeout
forall a b. (a -> b) -> a -> b
$ Integer -> NominalDiffTime
forall a. Num a => Integer -> a
fromInteger Integer
q, NominalDiffTime -> ApiTransactionTimeout
ApiTransactionTimeout NominalDiffTime
r)
   where
    (Integer
q, NominalDiffTime
r) = NominalDiffTime -> (Integer, NominalDiffTime)
forall b. Integral b => NominalDiffTime -> (b, NominalDiffTime)
forall a b. (RealFrac a, Integral b) => a -> (b, a)
properFraction (NominalDiffTime
a NominalDiffTime -> NominalDiffTime -> NominalDiffTime
forall a. Fractional a => a -> a -> a
/ NominalDiffTime
b)

  toInteger :: ApiTransactionTimeout -> Integer
toInteger (ApiTransactionTimeout NominalDiffTime
a) = NominalDiffTime -> Integer
forall b. Integral b => NominalDiffTime -> b
forall a b. (RealFrac a, Integral b) => a -> b
round NominalDiffTime
a

instance Arbitrary ApiTransactionTimeout where
  arbitrary :: Gen ApiTransactionTimeout
arbitrary = NominalDiffTime -> ApiTransactionTimeout
ApiTransactionTimeout (NominalDiffTime -> ApiTransactionTimeout)
-> (Integer -> NominalDiffTime) -> Integer -> ApiTransactionTimeout
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> NominalDiffTime
forall a. Num a => Integer -> a
fromInteger (Integer -> ApiTransactionTimeout)
-> Gen Integer -> Gen ApiTransactionTimeout
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Integer, Integer) -> Gen Integer
forall a. Random a => (a, a) -> Gen a
choose (Integer
0, Integer
86400)