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

module Data.FuzzyTime.Types.Gen where

import Data.FuzzyTime.Types
import Data.GenValidity
import Data.GenValidity.Time ()
import Test.QuickCheck

instance GenValid AmbiguousLocalTime where
  genValid :: Gen AmbiguousLocalTime
genValid = Gen AmbiguousLocalTime
forall a. (Generic a, GGenValid (Rep a)) => Gen a
genValidStructurallyWithoutExtraChecking
  shrinkValid :: AmbiguousLocalTime -> [AmbiguousLocalTime]
shrinkValid = AmbiguousLocalTime -> [AmbiguousLocalTime]
forall a.
(Generic a, GValidRecursivelyShrink (Rep a),
 GValidSubterms (Rep a) a) =>
a -> [a]
shrinkValidStructurallyWithoutExtraFiltering

instance GenValid FuzzyLocalTime where
  genValid :: Gen FuzzyLocalTime
genValid = Gen FuzzyLocalTime
forall a. (Generic a, GGenValid (Rep a)) => Gen a
genValidStructurallyWithoutExtraChecking
  shrinkValid :: FuzzyLocalTime -> [FuzzyLocalTime]
shrinkValid = FuzzyLocalTime -> [FuzzyLocalTime]
forall a.
(Generic a, GValidRecursivelyShrink (Rep a),
 GValidSubterms (Rep a) a) =>
a -> [a]
shrinkValidStructurallyWithoutExtraFiltering

instance GenValid FuzzyTimeOfDay where
  genValid :: Gen FuzzyTimeOfDay
genValid =
    [Gen FuzzyTimeOfDay] -> Gen FuzzyTimeOfDay
forall a. [Gen a] -> Gen a
oneof
      [ FuzzyTimeOfDay -> Gen FuzzyTimeOfDay
forall a. a -> Gen a
forall (f :: * -> *) a. Applicative f => a -> f a
pure FuzzyTimeOfDay
SameTime,
        FuzzyTimeOfDay -> Gen FuzzyTimeOfDay
forall a. a -> Gen a
forall (f :: * -> *) a. Applicative f => a -> f a
pure FuzzyTimeOfDay
Midnight,
        FuzzyTimeOfDay -> Gen FuzzyTimeOfDay
forall a. a -> Gen a
forall (f :: * -> *) a. Applicative f => a -> f a
pure FuzzyTimeOfDay
Morning,
        FuzzyTimeOfDay -> Gen FuzzyTimeOfDay
forall a. a -> Gen a
forall (f :: * -> *) a. Applicative f => a -> f a
pure FuzzyTimeOfDay
Evening,
        Int -> FuzzyTimeOfDay
AtHour (Int -> FuzzyTimeOfDay) -> Gen Int -> Gen FuzzyTimeOfDay
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),
        Int -> Int -> FuzzyTimeOfDay
AtMinute (Int -> Int -> FuzzyTimeOfDay)
-> Gen Int -> Gen (Int -> FuzzyTimeOfDay)
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 -> FuzzyTimeOfDay) -> Gen Int -> Gen FuzzyTimeOfDay
forall a b. Gen (a -> b) -> Gen a -> Gen b
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),
        TimeOfDay -> FuzzyTimeOfDay
AtExact (TimeOfDay -> FuzzyTimeOfDay)
-> Gen TimeOfDay -> Gen FuzzyTimeOfDay
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen TimeOfDay
forall a. GenValid a => Gen a
genValid,
        Int -> FuzzyTimeOfDay
HoursDiff (Int -> FuzzyTimeOfDay) -> Gen Int -> Gen FuzzyTimeOfDay
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
23, Int
23),
        Int -> FuzzyTimeOfDay
MinutesDiff (Int -> FuzzyTimeOfDay) -> Gen Int -> Gen FuzzyTimeOfDay
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
24 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
60 Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1), Int
24 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
60 Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1),
        Pico -> FuzzyTimeOfDay
SecondsDiff (Pico -> FuzzyTimeOfDay) -> Gen Pico -> Gen FuzzyTimeOfDay
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Pico
forall a. GenValid a => Gen a
genValid
      ]
      Gen FuzzyTimeOfDay
-> (FuzzyTimeOfDay -> Bool) -> Gen FuzzyTimeOfDay
forall a. Gen a -> (a -> Bool) -> Gen a
`suchThat` FuzzyTimeOfDay -> Bool
forall a. Validity a => a -> Bool
isValid
  shrinkValid :: FuzzyTimeOfDay -> [FuzzyTimeOfDay]
shrinkValid = FuzzyTimeOfDay -> [FuzzyTimeOfDay]
forall a.
(Validity a, Generic a, GValidRecursivelyShrink (Rep a),
 GValidSubterms (Rep a) a) =>
a -> [a]
shrinkValidStructurally

instance GenValid FuzzyDay where
  genValid :: Gen FuzzyDay
genValid =
    [Gen FuzzyDay] -> Gen FuzzyDay
forall a. [Gen a] -> Gen a
oneof
      [ FuzzyDay -> Gen FuzzyDay
forall a. a -> Gen a
forall (f :: * -> *) a. Applicative f => a -> f a
pure FuzzyDay
Yesterday,
        FuzzyDay -> Gen FuzzyDay
forall a. a -> Gen a
forall (f :: * -> *) a. Applicative f => a -> f a
pure FuzzyDay
Now,
        FuzzyDay -> Gen FuzzyDay
forall a. a -> Gen a
forall (f :: * -> *) a. Applicative f => a -> f a
pure FuzzyDay
Today,
        FuzzyDay -> Gen FuzzyDay
forall a. a -> Gen a
forall (f :: * -> *) a. Applicative f => a -> f a
pure FuzzyDay
Tomorrow,
        Word8 -> FuzzyDay
OnlyDay (Word8 -> FuzzyDay) -> Gen Word8 -> Gen FuzzyDay
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Word8, Word8) -> Gen Word8
forall a. Random a => (a, a) -> Gen a
choose (Word8
1, Word8
31),
        Word8 -> Word8 -> FuzzyDay
DayInMonth (Word8 -> Word8 -> FuzzyDay)
-> Gen Word8 -> Gen (Word8 -> FuzzyDay)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Word8, Word8) -> Gen Word8
forall a. Random a => (a, a) -> Gen a
choose (Word8
1, Word8
31) Gen (Word8 -> FuzzyDay) -> Gen Word8 -> Gen FuzzyDay
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Word8, Word8) -> Gen Word8
forall a. Random a => (a, a) -> Gen a
choose (Word8
1, Word8
12),
        Int16 -> FuzzyDay
DiffDays (Int16 -> FuzzyDay) -> Gen Int16 -> Gen FuzzyDay
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Int16
forall a. GenValid a => Gen a
genValid,
        Int16 -> FuzzyDay
DiffWeeks (Int16 -> FuzzyDay) -> Gen Int16 -> Gen FuzzyDay
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Int16
forall a. GenValid a => Gen a
genValid,
        DayOfWeek -> Int16 -> FuzzyDay
DayOfTheWeek (DayOfWeek -> Int16 -> FuzzyDay)
-> Gen DayOfWeek -> Gen (Int16 -> FuzzyDay)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen DayOfWeek
forall a. GenValid a => Gen a
genValid Gen (Int16 -> FuzzyDay) -> Gen Int16 -> Gen FuzzyDay
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Int16
forall a. GenValid a => Gen a
genValid,
        Day -> FuzzyDay
ExactDay (Day -> FuzzyDay) -> Gen Day -> Gen FuzzyDay
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Day
forall a. GenValid a => Gen a
genValid
      ]
      Gen FuzzyDay -> (FuzzyDay -> Bool) -> Gen FuzzyDay
forall a. Gen a -> (a -> Bool) -> Gen a
`suchThat` FuzzyDay -> Bool
forall a. Validity a => a -> Bool
isValid
  shrinkValid :: FuzzyDay -> [FuzzyDay]
shrinkValid = FuzzyDay -> [FuzzyDay]
forall a.
(Validity a, Generic a, GValidRecursivelyShrink (Rep a),
 GValidSubterms (Rep a) a) =>
a -> [a]
shrinkValidStructurally