module HaskellWorks.Polysemy.Hedgehog.Time (
    genPOSIXTime,
) where

import           Data.Time.Clock.POSIX (POSIXTime)

import           Hedgehog
import qualified Hedgehog.Gen          as Gen
import qualified Hedgehog.Range        as Range

import           HaskellWorks.Prelude

genPOSIXTime :: Gen POSIXTime
genPOSIXTime :: Gen POSIXTime
genPOSIXTime = do
    -- Generate a random integer within a reasonable range for POSIX time
    -- POSIXTime is a type synonym for NominalDiffTime, which is in seconds
    -- We'll use a range from 0 to a large number of seconds to cover a wide time span
    Word64
seconds <- Range Word64 -> GenT Identity Word64
forall (m :: * -> *) a. (MonadGen m, Integral a) => Range a -> m a
Gen.integral (Word64 -> Word64 -> Range Word64
forall a. Integral a => a -> a -> Range a
Range.linear Word64
0 Word64
4_102_444_800) -- Up to year 2100
    POSIXTime -> Gen POSIXTime
forall a. a -> GenT Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (POSIXTime -> Gen POSIXTime) -> POSIXTime -> Gen POSIXTime
forall a b. (a -> b) -> a -> b
$ forall a b. (Integral a, Num b) => a -> b
fromIntegral @Word64 Word64
seconds