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

module Data.GenValidity.Time.Clock where
#if !MIN_VERSION_base(4,8,0)
import Control.Applicative ((<*>))
import Data.Functor ((<$>))
#endif
import Data.GenValidity
import Data.GenValidity.Time.Calendar ()
import Data.Time.Clock
import Data.Validity.Time.Clock ()

import Test.QuickCheck

instance GenUnchecked UniversalTime where
    genUnchecked = ModJulianDate <$> genUnchecked

instance GenValid UniversalTime where
    genValid = ModJulianDate <$> genValid

instance GenUnchecked DiffTime where
    genUnchecked = picosecondsToDiffTime <$> genUnchecked

instance GenValid DiffTime where
    genValid = picosecondsToDiffTime <$> genValid

instance GenUnchecked UTCTime where
    genUnchecked = UTCTime <$> genUnchecked <*> genUnchecked

instance GenValid UTCTime where
    genValid =
        UTCTime <$> genValid <*>
        (genValid `suchThat` (>= 0) `suchThat` (<= 86400))

instance GenInvalid UTCTime

instance GenUnchecked NominalDiffTime where
    genUnchecked = (fromIntegral :: Integer -> NominalDiffTime) <$> genUnchecked

instance GenValid NominalDiffTime