packages feed

genvalidity-time-1.0.0.0: src/Data/GenValidity/Time/LocalTime.hs

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

module Data.GenValidity.Time.LocalTime where

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

instance GenValid TimeZone where
  genValid = TimeZone <$> genValid <*> genValid <*> genTimeZoneName
  shrinkValid (TimeZone m so n) =
    [TimeZone m' so' n' | (m', so', n') <- shrinkValid (m, so, n)]

genTimeZoneName :: Gen String
genTimeZoneName =
  frequency
    [ (1, pure ""),
      ( 4, -- Any three characters
        (:) <$> genValid
          <*> ((:) <$> genValid <*> ((:) <$> genValid <*> pure []))
      ),
      ( 4, -- A +HHMM string
        (:) <$> elements ['-', '+']
          <*> ( formatTime defaultTimeLocale "%H%M"
                  <$> (TimeOfDay <$> choose (0, 23) <*> choose (0, 59) <*> pure 0)
              )
      ),
      (1, genValid)
    ]

instance GenValid TimeOfDay where
  genValid =
    TimeOfDay <$> (choose (0, 23)) <*> (choose (0, 59))
      <*> (MkFixed <$> choose (0, 60999999999999))
  shrinkValid (TimeOfDay h m s) =
    filter isValid [TimeOfDay h' m' s' | (h', m', s') <- shrinkValid (h, m, s)]

instance GenValid LocalTime where
  genValid = LocalTime <$> genValid <*> genValid
  shrinkValid (LocalTime d tod) =
    filter isValid [LocalTime d' tod' | (d', tod') <- shrinkValid (d, tod)]

instance GenValid ZonedTime where
  genValid = ZonedTime <$> genValid <*> genValid
  shrinkValid (ZonedTime lt tz) =
    filter isValid [ZonedTime lt' tz' | (lt', tz') <- shrinkValid (lt, tz)]

instance GenValid CalendarDiffTime where
  genValid = CalendarDiffTime <$> genValid <*> genValid
  shrinkValid (CalendarDiffTime ms t) = [CalendarDiffTime ms' t' | (ms', t') <- shrinkValid (ms, t)]