{-# OPTIONS_GHC -fno-warn-orphans #-}

module Data.GenValidity.Time.Clock where

import Data.GenValidity
import Data.GenValidity.Time.Calendar ()
import Data.Time.Clock
import Data.Validity.Time.Clock ()
import Test.QuickCheck

instance GenValid UniversalTime where
  genValid :: Gen UniversalTime
genValid = Rational -> UniversalTime
ModJulianDate forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. GenValid a => Gen a
genValid
  shrinkValid :: UniversalTime -> [UniversalTime]
shrinkValid = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Rational -> UniversalTime
ModJulianDate forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. GenValid a => a -> [a]
shrinkValid forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniversalTime -> Rational
getModJulianDate

instance GenValid DiffTime where
  genValid :: Gen DiffTime
genValid = Integer -> DiffTime
picosecondsToDiffTime forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. GenValid a => Gen a
genValid
  shrinkValid :: DiffTime -> [DiffTime]
shrinkValid = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Integer -> DiffTime
picosecondsToDiffTime forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. GenValid a => a -> [a]
shrinkValid forall b c a. (b -> c) -> (a -> b) -> a -> c
. DiffTime -> Integer
diffTimeToPicoseconds

instance GenValid UTCTime where
  genValid :: Gen UTCTime
genValid =
    Day -> DiffTime -> UTCTime
UTCTime forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. GenValid a => Gen a
genValid forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Random a => (a, a) -> Gen a
choose (Int
0 :: Int, Int
86400))
  shrinkValid :: UTCTime -> [UTCTime]
shrinkValid (UTCTime Day
d DiffTime
dt) =
    [Day -> DiffTime -> UTCTime
UTCTime Day
d' DiffTime
dt' | (Day
d', DiffTime
dt') <- forall a. GenValid a => a -> [a]
shrinkValid (Day
d, DiffTime
dt)]

instance GenValid NominalDiffTime where
  genValid :: Gen NominalDiffTime
genValid = Pico -> NominalDiffTime
secondsToNominalDiffTime forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. GenValid a => Gen a
genValid
  shrinkValid :: NominalDiffTime -> [NominalDiffTime]
shrinkValid = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Pico -> NominalDiffTime
secondsToNominalDiffTime forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. GenValid a => a -> [a]
shrinkValid forall b c a. (b -> c) -> (a -> b) -> a -> c
. NominalDiffTime -> Pico
nominalDiffTimeToSeconds