{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleContexts #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Test.QuickCheck.Instances.Time () where
import Prelude ()
import Test.QuickCheck.Instances.CustomPrelude
import Test.QuickCheck
import qualified Data.Time.Calendar.Compat as Time
import qualified Data.Time.Calendar.Month.Compat as Time
import qualified Data.Time.Calendar.Quarter.Compat as Time
import qualified Data.Time.Clock.Compat as Time
import qualified Data.Time.Clock.System.Compat as Time
import qualified Data.Time.Clock.TAI.Compat as Time
import qualified Data.Time.LocalTime.Compat as Time
instance Arbitrary Time.Day where
arbitrary :: Gen Day
arbitrary = Integer -> Day
Time.ModifiedJulianDay (Integer -> Day) -> (Integer -> Integer) -> Integer -> Day
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Integer
2000 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+) (Integer -> Day) -> Gen Integer -> Gen Day
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Integer
forall a. Arbitrary a => Gen a
arbitrary
shrink :: Day -> [Day]
shrink = (Integer -> Day
Time.ModifiedJulianDay (Integer -> Day) -> [Integer] -> [Day]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) ([Integer] -> [Day]) -> (Day -> [Integer]) -> Day -> [Day]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> [Integer]
forall a. Arbitrary a => a -> [a]
shrink (Integer -> [Integer]) -> (Day -> Integer) -> Day -> [Integer]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Day -> Integer
Time.toModifiedJulianDay
instance CoArbitrary Time.Day where
coarbitrary :: Day -> Gen b -> Gen b
coarbitrary = Integer -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary (Integer -> Gen b -> Gen b)
-> (Day -> Integer) -> Day -> Gen b -> Gen b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Day -> Integer
Time.toModifiedJulianDay
instance Function Time.Day where
function :: (Day -> b) -> Day :-> b
function = (Day -> Integer) -> (Integer -> Day) -> (Day -> b) -> Day :-> b
forall b a c.
Function b =>
(a -> b) -> (b -> a) -> (a -> c) -> a :-> c
functionMap Day -> Integer
Time.toModifiedJulianDay Integer -> Day
Time.ModifiedJulianDay
instance Arbitrary Time.UniversalTime where
arbitrary :: Gen UniversalTime
arbitrary = Rational -> UniversalTime
Time.ModJulianDate (Rational -> UniversalTime)
-> (Rational -> Rational) -> Rational -> UniversalTime
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Rational
2000 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
+) (Rational -> UniversalTime) -> Gen Rational -> Gen UniversalTime
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Rational
forall a. Arbitrary a => Gen a
arbitrary
shrink :: UniversalTime -> [UniversalTime]
shrink = (Rational -> UniversalTime
Time.ModJulianDate (Rational -> UniversalTime) -> [Rational] -> [UniversalTime]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) ([Rational] -> [UniversalTime])
-> (UniversalTime -> [Rational])
-> UniversalTime
-> [UniversalTime]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rational -> [Rational]
forall a. Arbitrary a => a -> [a]
shrink (Rational -> [Rational])
-> (UniversalTime -> Rational) -> UniversalTime -> [Rational]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniversalTime -> Rational
Time.getModJulianDate
instance CoArbitrary Time.UniversalTime where
coarbitrary :: UniversalTime -> Gen b -> Gen b
coarbitrary = Rational -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary (Rational -> Gen b -> Gen b)
-> (UniversalTime -> Rational) -> UniversalTime -> Gen b -> Gen b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UniversalTime -> Rational
Time.getModJulianDate
instance Arbitrary Time.DiffTime where
arbitrary :: Gen DiffTime
arbitrary = Gen DiffTime
forall a. Fractional a => Gen a
arbitrarySizedFractional
#if MIN_VERSION_time(1,3,0)
shrink :: DiffTime -> [DiffTime]
shrink = DiffTime -> [DiffTime]
forall a. RealFrac a => a -> [a]
shrinkRealFrac
#else
shrink = (fromRational <$>) . shrink . toRational
#endif
instance CoArbitrary Time.DiffTime where
coarbitrary :: DiffTime -> Gen b -> Gen b
coarbitrary = DiffTime -> Gen b -> Gen b
forall a b. Real a => a -> Gen b -> Gen b
coarbitraryReal
instance Function Time.DiffTime where
function :: (DiffTime -> b) -> DiffTime :-> b
function = (DiffTime -> Rational)
-> (Rational -> DiffTime) -> (DiffTime -> b) -> DiffTime :-> b
forall b a c.
Function b =>
(a -> b) -> (b -> a) -> (a -> c) -> a :-> c
functionMap DiffTime -> Rational
forall a. Real a => a -> Rational
toRational Rational -> DiffTime
forall a. Fractional a => Rational -> a
fromRational
instance Arbitrary Time.UTCTime where
arbitrary :: Gen UTCTime
arbitrary =
Day -> DiffTime -> UTCTime
Time.UTCTime
(Day -> DiffTime -> UTCTime)
-> Gen Day -> Gen (DiffTime -> UTCTime)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Day
forall a. Arbitrary a => Gen a
arbitrary
Gen (DiffTime -> UTCTime) -> Gen DiffTime -> Gen UTCTime
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Rational -> DiffTime
forall a. Fractional a => Rational -> a
fromRational (Rational -> DiffTime)
-> (Double -> Rational) -> Double -> DiffTime
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> Rational
forall a. Real a => a -> Rational
toRational (Double -> DiffTime) -> Gen Double -> Gen DiffTime
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Double, Double) -> Gen Double
forall a. Random a => (a, a) -> Gen a
choose (Double
0::Double, Double
86400))
shrink :: UTCTime -> [UTCTime]
shrink ut :: UTCTime
ut@(Time.UTCTime Day
day DiffTime
dayTime) =
[ UTCTime
ut { utctDay :: Day
Time.utctDay = Day
d' } | Day
d' <- Day -> [Day]
forall a. Arbitrary a => a -> [a]
shrink Day
day ] [UTCTime] -> [UTCTime] -> [UTCTime]
forall a. [a] -> [a] -> [a]
++
[ UTCTime
ut { utctDayTime :: DiffTime
Time.utctDayTime = DiffTime
t' } | DiffTime
t' <- DiffTime -> [DiffTime]
forall a. Arbitrary a => a -> [a]
shrink DiffTime
dayTime ]
instance CoArbitrary Time.UTCTime where
coarbitrary :: UTCTime -> Gen b -> Gen b
coarbitrary (Time.UTCTime Day
day DiffTime
dayTime) =
Day -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Day
day (Gen b -> Gen b) -> (Gen b -> Gen b) -> Gen b -> Gen b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DiffTime -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary DiffTime
dayTime
instance Function Time.UTCTime where
function :: (UTCTime -> b) -> UTCTime :-> b
function = (UTCTime -> (Day, DiffTime))
-> ((Day, DiffTime) -> UTCTime) -> (UTCTime -> b) -> UTCTime :-> b
forall b a c.
Function b =>
(a -> b) -> (b -> a) -> (a -> c) -> a :-> c
functionMap (\(Time.UTCTime Day
day DiffTime
dt) -> (Day
day,DiffTime
dt))
((Day -> DiffTime -> UTCTime) -> (Day, DiffTime) -> UTCTime
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Day -> DiffTime -> UTCTime
Time.UTCTime)
instance Arbitrary Time.NominalDiffTime where
arbitrary :: Gen NominalDiffTime
arbitrary = Gen NominalDiffTime
forall a. Fractional a => Gen a
arbitrarySizedFractional
shrink :: NominalDiffTime -> [NominalDiffTime]
shrink = NominalDiffTime -> [NominalDiffTime]
forall a. RealFrac a => a -> [a]
shrinkRealFrac
instance CoArbitrary Time.NominalDiffTime where
coarbitrary :: NominalDiffTime -> Gen b -> Gen b
coarbitrary = NominalDiffTime -> Gen b -> Gen b
forall a b. Real a => a -> Gen b -> Gen b
coarbitraryReal
instance Function Time.NominalDiffTime where
function :: (NominalDiffTime -> b) -> NominalDiffTime :-> b
function = (NominalDiffTime -> Rational)
-> (Rational -> NominalDiffTime)
-> (NominalDiffTime -> b)
-> NominalDiffTime :-> b
forall b a c.
Function b =>
(a -> b) -> (b -> a) -> (a -> c) -> a :-> c
functionMap NominalDiffTime -> Rational
forall a. Real a => a -> Rational
toRational Rational -> NominalDiffTime
forall a. Fractional a => Rational -> a
fromRational
instance Arbitrary Time.TimeZone where
arbitrary :: Gen TimeZone
arbitrary =
Int -> Bool -> String -> TimeZone
Time.TimeZone
(Int -> Bool -> String -> TimeZone)
-> Gen Int -> Gen (Bool -> String -> TimeZone)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Int, Int) -> Gen Int
forall a. Random a => (a, a) -> Gen a
choose (-Int
12Int -> Int -> Int
forall a. Num a => a -> a -> a
*Int
60,Int
14Int -> Int -> Int
forall a. Num a => a -> a -> a
*Int
60)
Gen (Bool -> String -> TimeZone)
-> Gen Bool -> Gen (String -> TimeZone)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Bool
forall a. Arbitrary a => Gen a
arbitrary
Gen (String -> TimeZone) -> Gen String -> Gen TimeZone
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ([Gen Char] -> Gen String
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence ([Gen Char] -> Gen String)
-> (Gen Char -> [Gen Char]) -> Gen Char -> Gen String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Gen Char -> [Gen Char]
forall a. Int -> a -> [a]
replicate Int
4 (Gen Char -> Gen String) -> Gen Char -> Gen String
forall a b. (a -> b) -> a -> b
$ (Char, Char) -> Gen Char
forall a. Random a => (a, a) -> Gen a
choose (Char
'A',Char
'Z'))
shrink :: TimeZone -> [TimeZone]
shrink tz :: TimeZone
tz@(Time.TimeZone Int
minutes Bool
summerOnly String
name) =
[ TimeZone
tz { timeZoneMinutes :: Int
Time.timeZoneMinutes = Int
m' } | Int
m' <- Int -> [Int]
forall a. Arbitrary a => a -> [a]
shrink Int
minutes ] [TimeZone] -> [TimeZone] -> [TimeZone]
forall a. [a] -> [a] -> [a]
++
[ TimeZone
tz { timeZoneSummerOnly :: Bool
Time.timeZoneSummerOnly = Bool
s' } | Bool
s' <- Bool -> [Bool]
forall a. Arbitrary a => a -> [a]
shrink Bool
summerOnly ] [TimeZone] -> [TimeZone] -> [TimeZone]
forall a. [a] -> [a] -> [a]
++
[ TimeZone
tz { timeZoneName :: String
Time.timeZoneName = String
n' } | String
n' <- String -> [String]
forall a. Arbitrary a => a -> [a]
shrink String
name ]
instance CoArbitrary Time.TimeZone where
coarbitrary :: TimeZone -> Gen b -> Gen b
coarbitrary (Time.TimeZone Int
minutes Bool
summerOnly String
name) =
Int -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Int
minutes (Gen b -> Gen b) -> (Gen b -> Gen b) -> Gen b -> Gen b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Bool
summerOnly (Gen b -> Gen b) -> (Gen b -> Gen b) -> Gen b -> Gen b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary String
name
instance Arbitrary Time.TimeOfDay where
arbitrary :: Gen TimeOfDay
arbitrary =
Int -> Int -> Pico -> TimeOfDay
Time.TimeOfDay
(Int -> Int -> Pico -> TimeOfDay)
-> Gen Int -> Gen (Int -> Pico -> TimeOfDay)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Int, Int) -> Gen Int
forall a. Random a => (a, a) -> Gen a
choose (Int
0, Int
23)
Gen (Int -> Pico -> TimeOfDay)
-> Gen Int -> Gen (Pico -> TimeOfDay)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Int, Int) -> Gen Int
forall a. Random a => (a, a) -> Gen a
choose (Int
0, Int
59)
Gen (Pico -> TimeOfDay) -> Gen Pico -> Gen TimeOfDay
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Rational -> Pico
forall a. Fractional a => Rational -> a
fromRational (Rational -> Pico) -> (Double -> Rational) -> Double -> Pico
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> Rational
forall a. Real a => a -> Rational
toRational (Double -> Pico) -> Gen Double -> Gen Pico
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Double, Double) -> Gen Double
forall a. Random a => (a, a) -> Gen a
choose (Double
0::Double, Double
60))
shrink :: TimeOfDay -> [TimeOfDay]
shrink tod :: TimeOfDay
tod@(Time.TimeOfDay Int
hour Int
minute Pico
sec) =
[ TimeOfDay
tod { todHour :: Int
Time.todHour = Int
h' } | Int
h' <- Int -> [Int]
forall a. Arbitrary a => a -> [a]
shrink Int
hour ] [TimeOfDay] -> [TimeOfDay] -> [TimeOfDay]
forall a. [a] -> [a] -> [a]
++
[ TimeOfDay
tod { todMin :: Int
Time.todMin = Int
m' } | Int
m' <- Int -> [Int]
forall a. Arbitrary a => a -> [a]
shrink Int
minute ] [TimeOfDay] -> [TimeOfDay] -> [TimeOfDay]
forall a. [a] -> [a] -> [a]
++
[ TimeOfDay
tod { todSec :: Pico
Time.todSec = Pico
s' } | Pico
s' <- Pico -> [Pico]
forall a. Arbitrary a => a -> [a]
shrink Pico
sec ]
instance CoArbitrary Time.TimeOfDay where
coarbitrary :: TimeOfDay -> Gen b -> Gen b
coarbitrary (Time.TimeOfDay Int
hour Int
minute Pico
sec) =
Int -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Int
hour (Gen b -> Gen b) -> (Gen b -> Gen b) -> Gen b -> Gen b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Int
minute (Gen b -> Gen b) -> (Gen b -> Gen b) -> Gen b -> Gen b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Pico -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Pico
sec
instance Arbitrary Time.LocalTime where
arbitrary :: Gen LocalTime
arbitrary =
Day -> TimeOfDay -> LocalTime
Time.LocalTime
(Day -> TimeOfDay -> LocalTime)
-> Gen Day -> Gen (TimeOfDay -> LocalTime)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Day
forall a. Arbitrary a => Gen a
arbitrary
Gen (TimeOfDay -> LocalTime) -> Gen TimeOfDay -> Gen LocalTime
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen TimeOfDay
forall a. Arbitrary a => Gen a
arbitrary
shrink :: LocalTime -> [LocalTime]
shrink lt :: LocalTime
lt@(Time.LocalTime Day
day TimeOfDay
tod) =
[ LocalTime
lt { localDay :: Day
Time.localDay = Day
d' } | Day
d' <- Day -> [Day]
forall a. Arbitrary a => a -> [a]
shrink Day
day ] [LocalTime] -> [LocalTime] -> [LocalTime]
forall a. [a] -> [a] -> [a]
++
[ LocalTime
lt { localTimeOfDay :: TimeOfDay
Time.localTimeOfDay = TimeOfDay
t' } | TimeOfDay
t' <- TimeOfDay -> [TimeOfDay]
forall a. Arbitrary a => a -> [a]
shrink TimeOfDay
tod ]
instance CoArbitrary Time.LocalTime where
coarbitrary :: LocalTime -> Gen b -> Gen b
coarbitrary (Time.LocalTime Day
day TimeOfDay
tod) =
Day -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Day
day (Gen b -> Gen b) -> (Gen b -> Gen b) -> Gen b -> Gen b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TimeOfDay -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary TimeOfDay
tod
instance Arbitrary Time.ZonedTime where
arbitrary :: Gen ZonedTime
arbitrary =
LocalTime -> TimeZone -> ZonedTime
Time.ZonedTime
(LocalTime -> TimeZone -> ZonedTime)
-> Gen LocalTime -> Gen (TimeZone -> ZonedTime)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen LocalTime
forall a. Arbitrary a => Gen a
arbitrary
Gen (TimeZone -> ZonedTime) -> Gen TimeZone -> Gen ZonedTime
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen TimeZone
forall a. Arbitrary a => Gen a
arbitrary
shrink :: ZonedTime -> [ZonedTime]
shrink zt :: ZonedTime
zt@(Time.ZonedTime LocalTime
lt TimeZone
zone) =
[ ZonedTime
zt { zonedTimeToLocalTime :: LocalTime
Time.zonedTimeToLocalTime = LocalTime
l' } | LocalTime
l' <- LocalTime -> [LocalTime]
forall a. Arbitrary a => a -> [a]
shrink LocalTime
lt ] [ZonedTime] -> [ZonedTime] -> [ZonedTime]
forall a. [a] -> [a] -> [a]
++
[ ZonedTime
zt { zonedTimeZone :: TimeZone
Time.zonedTimeZone = TimeZone
z' } | TimeZone
z' <- TimeZone -> [TimeZone]
forall a. Arbitrary a => a -> [a]
shrink TimeZone
zone ]
instance CoArbitrary Time.ZonedTime where
coarbitrary :: ZonedTime -> Gen b -> Gen b
coarbitrary (Time.ZonedTime LocalTime
lt TimeZone
zone) =
LocalTime -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary LocalTime
lt (Gen b -> Gen b) -> (Gen b -> Gen b) -> Gen b -> Gen b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TimeZone -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary TimeZone
zone
instance Arbitrary Time.AbsoluteTime where
arbitrary :: Gen AbsoluteTime
arbitrary =
DiffTime -> AbsoluteTime -> AbsoluteTime
Time.addAbsoluteTime
(DiffTime -> AbsoluteTime -> AbsoluteTime)
-> Gen DiffTime -> Gen (AbsoluteTime -> AbsoluteTime)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen DiffTime
forall a. Arbitrary a => Gen a
arbitrary
Gen (AbsoluteTime -> AbsoluteTime)
-> Gen AbsoluteTime -> Gen AbsoluteTime
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AbsoluteTime -> Gen AbsoluteTime
forall (m :: * -> *) a. Monad m => a -> m a
return AbsoluteTime
Time.taiEpoch
shrink :: AbsoluteTime -> [AbsoluteTime]
shrink AbsoluteTime
at =
(DiffTime -> AbsoluteTime -> AbsoluteTime
`Time.addAbsoluteTime` AbsoluteTime
at) (DiffTime -> AbsoluteTime) -> [DiffTime] -> [AbsoluteTime]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> DiffTime -> [DiffTime]
forall a. Arbitrary a => a -> [a]
shrink (AbsoluteTime -> AbsoluteTime -> DiffTime
Time.diffAbsoluteTime AbsoluteTime
at AbsoluteTime
Time.taiEpoch)
instance CoArbitrary Time.AbsoluteTime where
coarbitrary :: AbsoluteTime -> Gen b -> Gen b
coarbitrary = DiffTime -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary (DiffTime -> Gen b -> Gen b)
-> (AbsoluteTime -> DiffTime) -> AbsoluteTime -> Gen b -> Gen b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (AbsoluteTime -> AbsoluteTime -> DiffTime)
-> AbsoluteTime -> AbsoluteTime -> DiffTime
forall a b c. (a -> b -> c) -> b -> a -> c
flip AbsoluteTime -> AbsoluteTime -> DiffTime
Time.diffAbsoluteTime AbsoluteTime
Time.taiEpoch
instance Arbitrary Time.DayOfWeek where
arbitrary :: Gen DayOfWeek
arbitrary = [DayOfWeek] -> Gen DayOfWeek
forall a. [a] -> Gen a
elements [DayOfWeek
Time.Monday .. DayOfWeek
Time.Sunday]
instance CoArbitrary Time.DayOfWeek where
coarbitrary :: DayOfWeek -> Gen b -> Gen b
coarbitrary = Int -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary (Int -> Gen b -> Gen b)
-> (DayOfWeek -> Int) -> DayOfWeek -> Gen b -> Gen b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DayOfWeek -> Int
forall a. Enum a => a -> Int
fromEnum
instance Function Time.DayOfWeek where
function :: (DayOfWeek -> b) -> DayOfWeek :-> b
function = (DayOfWeek -> Int)
-> (Int -> DayOfWeek) -> (DayOfWeek -> b) -> DayOfWeek :-> b
forall b a c.
Function b =>
(a -> b) -> (b -> a) -> (a -> c) -> a :-> c
functionMap DayOfWeek -> Int
forall a. Enum a => a -> Int
fromEnum Int -> DayOfWeek
forall a. Enum a => Int -> a
toEnum
instance Arbitrary Time.SystemTime where
arbitrary :: Gen SystemTime
arbitrary = Int64 -> Word32 -> SystemTime
Time.MkSystemTime (Int64 -> Word32 -> SystemTime)
-> Gen Int64 -> Gen (Word32 -> SystemTime)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Int64
forall a. Arbitrary a => Gen a
arbitrary Gen (Word32 -> SystemTime) -> Gen Word32 -> Gen SystemTime
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Word32
nano where
nano :: Gen Word32
nano = [(Int, Gen Word32)] -> Gen Word32
forall a. [(Int, Gen a)] -> Gen a
frequency
[ (Int
1, Word32 -> Gen Word32
forall (f :: * -> *) a. Applicative f => a -> f a
pure Word32
0)
, (Int
15, (Word32, Word32) -> Gen Word32
forall a. Random a => (a, a) -> Gen a
choose (Word32
0, Word32
999999999))
]
shrink :: SystemTime -> [SystemTime]
shrink (Time.MkSystemTime Int64
s Word32
n) = ((Int64, Word32) -> SystemTime)
-> [(Int64, Word32)] -> [SystemTime]
forall a b. (a -> b) -> [a] -> [b]
map ((Int64 -> Word32 -> SystemTime) -> (Int64, Word32) -> SystemTime
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Int64 -> Word32 -> SystemTime
Time.MkSystemTime) ((Int64, Word32) -> [(Int64, Word32)]
forall a. Arbitrary a => a -> [a]
shrink (Int64
s, Word32
n))
instance CoArbitrary Time.SystemTime where
coarbitrary :: SystemTime -> Gen b -> Gen b
coarbitrary (Time.MkSystemTime Int64
s Word32
n) = (Int64, Word32) -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary (Int64
s, Word32
n)
instance Function Time.SystemTime where
function :: (SystemTime -> b) -> SystemTime :-> b
function = (SystemTime -> (Int64, Word32))
-> ((Int64, Word32) -> SystemTime)
-> (SystemTime -> b)
-> SystemTime :-> b
forall b a c.
Function b =>
(a -> b) -> (b -> a) -> (a -> c) -> a :-> c
functionMap
(\(Time.MkSystemTime Int64
s Word32
n) -> (Int64
s, Word32
n))
((Int64 -> Word32 -> SystemTime) -> (Int64, Word32) -> SystemTime
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Int64 -> Word32 -> SystemTime
Time.MkSystemTime)
instance Arbitrary Time.CalendarDiffDays where
arbitrary :: Gen CalendarDiffDays
arbitrary = Integer -> Integer -> CalendarDiffDays
Time.CalendarDiffDays (Integer -> Integer -> CalendarDiffDays)
-> Gen Integer -> Gen (Integer -> CalendarDiffDays)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Integer
forall a. Arbitrary a => Gen a
arbitrary Gen (Integer -> CalendarDiffDays)
-> Gen Integer -> Gen CalendarDiffDays
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Integer
forall a. Arbitrary a => Gen a
arbitrary
shrink :: CalendarDiffDays -> [CalendarDiffDays]
shrink (Time.CalendarDiffDays Integer
m Integer
d) = ((Integer, Integer) -> CalendarDiffDays)
-> [(Integer, Integer)] -> [CalendarDiffDays]
forall a b. (a -> b) -> [a] -> [b]
map ((Integer -> Integer -> CalendarDiffDays)
-> (Integer, Integer) -> CalendarDiffDays
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Integer -> Integer -> CalendarDiffDays
Time.CalendarDiffDays) ((Integer, Integer) -> [(Integer, Integer)]
forall a. Arbitrary a => a -> [a]
shrink (Integer
m, Integer
d))
instance CoArbitrary Time.CalendarDiffDays where
coarbitrary :: CalendarDiffDays -> Gen b -> Gen b
coarbitrary (Time.CalendarDiffDays Integer
m Integer
d) = (Integer, Integer) -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary (Integer
m, Integer
d)
instance Function Time.CalendarDiffDays where
function :: (CalendarDiffDays -> b) -> CalendarDiffDays :-> b
function = (CalendarDiffDays -> (Integer, Integer))
-> ((Integer, Integer) -> CalendarDiffDays)
-> (CalendarDiffDays -> b)
-> CalendarDiffDays :-> b
forall b a c.
Function b =>
(a -> b) -> (b -> a) -> (a -> c) -> a :-> c
functionMap
(\(Time.CalendarDiffDays Integer
m Integer
d) -> (Integer
m, Integer
d))
((Integer -> Integer -> CalendarDiffDays)
-> (Integer, Integer) -> CalendarDiffDays
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Integer -> Integer -> CalendarDiffDays
Time.CalendarDiffDays)
instance Arbitrary Time.CalendarDiffTime where
arbitrary :: Gen CalendarDiffTime
arbitrary = Integer -> NominalDiffTime -> CalendarDiffTime
Time.CalendarDiffTime (Integer -> NominalDiffTime -> CalendarDiffTime)
-> Gen Integer -> Gen (NominalDiffTime -> CalendarDiffTime)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Integer
forall a. Arbitrary a => Gen a
arbitrary Gen (NominalDiffTime -> CalendarDiffTime)
-> Gen NominalDiffTime -> Gen CalendarDiffTime
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen NominalDiffTime
forall a. Arbitrary a => Gen a
arbitrary
shrink :: CalendarDiffTime -> [CalendarDiffTime]
shrink (Time.CalendarDiffTime Integer
m NominalDiffTime
d) = ((Integer, NominalDiffTime) -> CalendarDiffTime)
-> [(Integer, NominalDiffTime)] -> [CalendarDiffTime]
forall a b. (a -> b) -> [a] -> [b]
map ((Integer -> NominalDiffTime -> CalendarDiffTime)
-> (Integer, NominalDiffTime) -> CalendarDiffTime
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Integer -> NominalDiffTime -> CalendarDiffTime
Time.CalendarDiffTime) ((Integer, NominalDiffTime) -> [(Integer, NominalDiffTime)]
forall a. Arbitrary a => a -> [a]
shrink (Integer
m, NominalDiffTime
d))
instance CoArbitrary Time.CalendarDiffTime where
coarbitrary :: CalendarDiffTime -> Gen b -> Gen b
coarbitrary (Time.CalendarDiffTime Integer
m NominalDiffTime
nt) = (Integer, NominalDiffTime) -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary (Integer
m, NominalDiffTime
nt)
instance Function Time.CalendarDiffTime where
function :: (CalendarDiffTime -> b) -> CalendarDiffTime :-> b
function = (CalendarDiffTime -> (Integer, NominalDiffTime))
-> ((Integer, NominalDiffTime) -> CalendarDiffTime)
-> (CalendarDiffTime -> b)
-> CalendarDiffTime :-> b
forall b a c.
Function b =>
(a -> b) -> (b -> a) -> (a -> c) -> a :-> c
functionMap
(\(Time.CalendarDiffTime Integer
m NominalDiffTime
nt) -> (Integer
m, NominalDiffTime
nt))
((Integer -> NominalDiffTime -> CalendarDiffTime)
-> (Integer, NominalDiffTime) -> CalendarDiffTime
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Integer -> NominalDiffTime -> CalendarDiffTime
Time.CalendarDiffTime)
instance Arbitrary Time.Month where
arbitrary :: Gen Month
arbitrary = do
Integer
y <- Gen Integer
forall a. Arbitrary a => Gen a
arbitrary
Int
m <- (Int, Int) -> Gen Int
chooseInt (Int
1,Int
12)
Month -> Gen Month
forall (m :: * -> *) a. Monad m => a -> m a
return (Integer -> Int -> Month
Time.fromYearMonth (Integer
y Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
2000) Int
m)
shrink :: Month -> [Month]
shrink Month
mm = case Month -> (Integer, Int)
Time.toYearMonth Month
mm of
(Integer
y, Int
m) -> do
(Integer
y', Int
m') <- (Integer, Int) -> [(Integer, Int)]
forall a. Arbitrary a => a -> [a]
shrink (Integer
y Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- Integer
2000, Int
m)
Month -> [Month]
forall (m :: * -> *) a. Monad m => a -> m a
return (Integer -> Int -> Month
Time.fromYearMonth (Integer
y' Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
2000) Int
m')
instance CoArbitrary Time.Month where
coarbitrary :: Month -> Gen b -> Gen b
coarbitrary (Time.MkMonth Integer
m) = Integer -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Integer
m
instance Function Time.Month where
function :: (Month -> b) -> Month :-> b
function = (Month -> Integer)
-> (Integer -> Month) -> (Month -> b) -> Month :-> b
forall b a c.
Function b =>
(a -> b) -> (b -> a) -> (a -> c) -> a :-> c
functionMap
(\(Time.MkMonth Integer
m) -> Integer
m)
Integer -> Month
Time.MkMonth
instance Arbitrary Time.QuarterOfYear where
arbitrary :: Gen QuarterOfYear
arbitrary = [QuarterOfYear] -> Gen QuarterOfYear
forall a. [a] -> Gen a
elements [ QuarterOfYear
Time.Q1 .. QuarterOfYear
Time.Q2 ]
instance CoArbitrary Time.QuarterOfYear where
coarbitrary :: QuarterOfYear -> Gen b -> Gen b
coarbitrary = Int -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary (Int -> Gen b -> Gen b)
-> (QuarterOfYear -> Int) -> QuarterOfYear -> Gen b -> Gen b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. QuarterOfYear -> Int
forall a. Enum a => a -> Int
fromEnum
instance Function Time.QuarterOfYear where
function :: (QuarterOfYear -> b) -> QuarterOfYear :-> b
function = (QuarterOfYear -> b) -> QuarterOfYear :-> b
forall a b. (Eq a, Bounded a, Enum a) => (a -> b) -> a :-> b
functionBoundedEnum
instance Arbitrary Time.Quarter where
arbitrary :: Gen Quarter
arbitrary = do
Integer
y <- Gen Integer
forall a. Arbitrary a => Gen a
arbitrary
QuarterOfYear
q <- Gen QuarterOfYear
forall a. Arbitrary a => Gen a
arbitrary
Quarter -> Gen Quarter
forall (m :: * -> *) a. Monad m => a -> m a
return (Integer -> QuarterOfYear -> Quarter
Time.fromYearQuarter (Integer
y Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
2000) QuarterOfYear
q)
shrink :: Quarter -> [Quarter]
shrink Quarter
qq = case Quarter -> (Integer, QuarterOfYear)
Time.toYearQuarter Quarter
qq of
(Integer
y, QuarterOfYear
q) -> do
(Integer
y', QuarterOfYear
q') <- (Integer, QuarterOfYear) -> [(Integer, QuarterOfYear)]
forall a. Arbitrary a => a -> [a]
shrink (Integer
y Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- Integer
2000, QuarterOfYear
q)
Quarter -> [Quarter]
forall (m :: * -> *) a. Monad m => a -> m a
return (Integer -> QuarterOfYear -> Quarter
Time.fromYearQuarter (Integer
y' Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
2000) QuarterOfYear
q')
instance CoArbitrary Time.Quarter where
coarbitrary :: Quarter -> Gen b -> Gen b
coarbitrary (Time.MkQuarter Integer
x) = Integer -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary Integer
x
instance Function Time.Quarter where
function :: (Quarter -> b) -> Quarter :-> b
function = (Quarter -> Integer)
-> (Integer -> Quarter) -> (Quarter -> b) -> Quarter :-> b
forall b a c.
Function b =>
(a -> b) -> (b -> a) -> (a -> c) -> a :-> c
functionMap
(\(Time.MkQuarter Integer
x) -> Integer
x)
Integer -> Quarter
Time.MkQuarter