From c6a718e767c127cd1707bf858ad2111a8b69def5 Mon Sep 17 00:00:00 2001 From: Ashley Yakeley Date: Thu, 29 Feb 2024 01:27:45 -0800 Subject: [PATCH] Add Generic instances to all types with exposed constructors (#252) --- changelog.md | 1 + lib/Data/Time/Calendar/CalendarDiffDays.hs | 2 ++ lib/Data/Time/Calendar/Days.hs | 3 ++- lib/Data/Time/Calendar/Month.hs | 3 ++- lib/Data/Time/Calendar/Quarter.hs | 5 +++-- lib/Data/Time/Calendar/Week.hs | 3 ++- lib/Data/Time/Clock/Internal/SystemTime.hs | 3 ++- lib/Data/Time/Clock/Internal/UTCTime.hs | 3 ++- lib/Data/Time/Clock/Internal/UniversalTime.hs | 3 ++- lib/Data/Time/LocalTime/Internal/CalendarDiffTime.hs | 2 ++ lib/Data/Time/LocalTime/Internal/LocalTime.hs | 3 ++- lib/Data/Time/LocalTime/Internal/TimeOfDay.hs | 3 ++- lib/Data/Time/LocalTime/Internal/TimeZone.hs | 3 ++- lib/Data/Time/LocalTime/Internal/ZonedTime.hs | 3 ++- time.cabal | 1 + 15 files changed, 29 insertions(+), 12 deletions(-) diff --git a/changelog.md b/changelog.md index 1e4fc7e3..1cc2fdca 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,7 @@ ## [next] - add Lift instances to all types +- add Generic instances to all types that have exposed constructors - fix show of CalendarDiffTime - fix diffGregorianDurationRollOver, diffJulianDurationRollOver diff --git a/lib/Data/Time/Calendar/CalendarDiffDays.hs b/lib/Data/Time/Calendar/CalendarDiffDays.hs index 84f6acee..9e111420 100644 --- a/lib/Data/Time/Calendar/CalendarDiffDays.hs +++ b/lib/Data/Time/Calendar/CalendarDiffDays.hs @@ -7,6 +7,7 @@ module Data.Time.Calendar.CalendarDiffDays ( import Control.DeepSeq import Data.Data +import GHC.Generics import qualified Language.Haskell.TH.Syntax as TH data CalendarDiffDays = CalendarDiffDays @@ -21,6 +22,7 @@ data CalendarDiffDays = CalendarDiffDays Typeable , -- | @since 1.13.0 TH.Lift + , Generic ) instance NFData CalendarDiffDays where diff --git a/lib/Data/Time/Calendar/Days.hs b/lib/Data/Time/Calendar/Days.hs index 98c8f522..8a2c1511 100644 --- a/lib/Data/Time/Calendar/Days.hs +++ b/lib/Data/Time/Calendar/Days.hs @@ -18,13 +18,14 @@ module Data.Time.Calendar.Days ( import Control.DeepSeq import Data.Data import Data.Ix +import GHC.Generics import qualified Language.Haskell.TH.Syntax as TH -- | The Modified Julian Day is a standard count of days, with zero being the day 1858-11-17. newtype Day = ModifiedJulianDay { toModifiedJulianDay :: Integer } - deriving (Eq, Ord, Data, Typeable, TH.Lift) + deriving (Eq, Ord, Data, Typeable, TH.Lift, Generic) instance NFData Day where rnf (ModifiedJulianDay a) = rnf a diff --git a/lib/Data/Time/Calendar/Month.hs b/lib/Data/Time/Calendar/Month.hs index 913cab70..59d27515 100644 --- a/lib/Data/Time/Calendar/Month.hs +++ b/lib/Data/Time/Calendar/Month.hs @@ -18,13 +18,14 @@ import Data.Ix import Data.Time.Calendar.Days import Data.Time.Calendar.Gregorian import Data.Time.Calendar.Private +import GHC.Generics import qualified Language.Haskell.TH.Syntax as TH import Text.ParserCombinators.ReadP import Text.Read -- | An absolute count of common calendar months. -- Number is equal to @(year * 12) + (monthOfYear - 1)@. -newtype Month = MkMonth Integer deriving (Eq, Ord, Data, Typeable, TH.Lift) +newtype Month = MkMonth Integer deriving (Eq, Ord, Data, Typeable, TH.Lift, Generic) instance NFData Month where rnf (MkMonth m) = rnf m diff --git a/lib/Data/Time/Calendar/Quarter.hs b/lib/Data/Time/Calendar/Quarter.hs index 0dabb46b..8c0191d8 100644 --- a/lib/Data/Time/Calendar/Quarter.hs +++ b/lib/Data/Time/Calendar/Quarter.hs @@ -22,12 +22,13 @@ import Data.Time.Calendar.Days import Data.Time.Calendar.Month import Data.Time.Calendar.Private import Data.Time.Calendar.Types +import GHC.Generics import qualified Language.Haskell.TH.Syntax as TH import Text.ParserCombinators.ReadP import Text.Read -- | Quarters of each year. Each quarter corresponds to three months. -data QuarterOfYear = Q1 | Q2 | Q3 | Q4 deriving (Eq, Ord, Data, Typeable, Read, Show, Ix, TH.Lift) +data QuarterOfYear = Q1 | Q2 | Q3 | Q4 deriving (Eq, Ord, Data, Typeable, Read, Show, Ix, TH.Lift, Generic) -- | maps Q1..Q4 to 1..4 instance Enum QuarterOfYear where @@ -54,7 +55,7 @@ instance NFData QuarterOfYear where -- | An absolute count of year quarters. -- Number is equal to @(year * 4) + (quarterOfYear - 1)@. -newtype Quarter = MkQuarter Integer deriving (Eq, Ord, Data, Typeable) +newtype Quarter = MkQuarter Integer deriving (Eq, Ord, Data, Typeable, Generic) instance NFData Quarter where rnf (MkQuarter m) = rnf m diff --git a/lib/Data/Time/Calendar/Week.hs b/lib/Data/Time/Calendar/Week.hs index 532d301e..4a174304 100644 --- a/lib/Data/Time/Calendar/Week.hs +++ b/lib/Data/Time/Calendar/Week.hs @@ -16,6 +16,7 @@ import Data.Data import Data.Fixed import Data.Ix import Data.Time.Calendar.Days +import GHC.Generics import qualified Language.Haskell.TH.Syntax as TH data DayOfWeek @@ -26,7 +27,7 @@ data DayOfWeek | Friday | Saturday | Sunday - deriving (Eq, Show, Read, Data, Typeable, Ord, Ix, TH.Lift) + deriving (Eq, Show, Read, Data, Typeable, Ord, Ix, TH.Lift, Generic) instance NFData DayOfWeek where rnf Monday = () diff --git a/lib/Data/Time/Clock/Internal/SystemTime.hs b/lib/Data/Time/Clock/Internal/SystemTime.hs index e035acdc..d58ac3f1 100644 --- a/lib/Data/Time/Clock/Internal/SystemTime.hs +++ b/lib/Data/Time/Clock/Internal/SystemTime.hs @@ -20,6 +20,7 @@ import Data.Data import Data.Int (Int64) import Data.Time.Clock.Internal.DiffTime import Data.Word +import GHC.Generics import qualified Language.Haskell.TH.Syntax as TH #ifdef mingw32_HOST_OS @@ -40,7 +41,7 @@ data SystemTime = MkSystemTime { systemSeconds :: {-# UNPACK #-} !Int64 , systemNanoseconds :: {-# UNPACK #-} !Word32 } - deriving (Eq, Ord, Show, Data, Typeable, TH.Lift) + deriving (Eq, Ord, Show, Data, Typeable, TH.Lift, Generic) instance NFData SystemTime where rnf a = a `seq` () diff --git a/lib/Data/Time/Clock/Internal/UTCTime.hs b/lib/Data/Time/Clock/Internal/UTCTime.hs index 404b5fdd..62287968 100644 --- a/lib/Data/Time/Clock/Internal/UTCTime.hs +++ b/lib/Data/Time/Clock/Internal/UTCTime.hs @@ -18,6 +18,7 @@ import Control.DeepSeq import Data.Data import Data.Time.Calendar.Days import Data.Time.Clock.Internal.DiffTime +import GHC.Generics import qualified Language.Haskell.TH.Syntax as TH -- | This is the simplest representation of UTC. @@ -29,7 +30,7 @@ data UTCTime = UTCTime , utctDayTime :: DiffTime -- ^ the time from midnight, 0 <= t < 86401s (because of leap-seconds) } - deriving (Data, Typeable, TH.Lift) + deriving (Data, Typeable, TH.Lift, Generic) instance NFData UTCTime where rnf (UTCTime d t) = rnf d `seq` rnf t `seq` () diff --git a/lib/Data/Time/Clock/Internal/UniversalTime.hs b/lib/Data/Time/Clock/Internal/UniversalTime.hs index a9f2ad5f..0af975e7 100644 --- a/lib/Data/Time/Clock/Internal/UniversalTime.hs +++ b/lib/Data/Time/Clock/Internal/UniversalTime.hs @@ -9,6 +9,7 @@ module Data.Time.Clock.Internal.UniversalTime ( import Control.DeepSeq import Data.Data +import GHC.Generics import qualified Language.Haskell.TH.Syntax as TH -- | The Modified Julian Date is the day with the fraction of the day, measured from UT midnight. @@ -16,7 +17,7 @@ import qualified Language.Haskell.TH.Syntax as TH newtype UniversalTime = ModJulianDate { getModJulianDate :: Rational } - deriving (Eq, Ord, Data, Typeable, TH.Lift) + deriving (Eq, Ord, Data, Typeable, TH.Lift, Generic) instance NFData UniversalTime where rnf (ModJulianDate a) = rnf a diff --git a/lib/Data/Time/LocalTime/Internal/CalendarDiffTime.hs b/lib/Data/Time/LocalTime/Internal/CalendarDiffTime.hs index f1b9b731..ad1c0cda 100644 --- a/lib/Data/Time/LocalTime/Internal/CalendarDiffTime.hs +++ b/lib/Data/Time/LocalTime/Internal/CalendarDiffTime.hs @@ -9,6 +9,7 @@ import Control.DeepSeq import Data.Data import Data.Time.Calendar.CalendarDiffDays import Data.Time.Clock.Internal.NominalDiffTime +import GHC.Generics data CalendarDiffTime = CalendarDiffTime { ctMonths :: Integer @@ -20,6 +21,7 @@ data CalendarDiffTime = CalendarDiffTime Data , -- | @since 1.9.2 Typeable + , Generic ) instance NFData CalendarDiffTime where diff --git a/lib/Data/Time/LocalTime/Internal/LocalTime.hs b/lib/Data/Time/LocalTime/Internal/LocalTime.hs index a92a47f9..88412cba 100644 --- a/lib/Data/Time/LocalTime/Internal/LocalTime.hs +++ b/lib/Data/Time/LocalTime/Internal/LocalTime.hs @@ -24,6 +24,7 @@ import Data.Time.Clock.Internal.UTCTime import Data.Time.Clock.Internal.UniversalTime import Data.Time.LocalTime.Internal.TimeOfDay import Data.Time.LocalTime.Internal.TimeZone +import GHC.Generics -- | A simple day and time aggregate, where the day is of the specified parameter, -- and the time is a TimeOfDay. @@ -33,7 +34,7 @@ data LocalTime = LocalTime { localDay :: Day , localTimeOfDay :: TimeOfDay } - deriving (Eq, Ord, Data, Typeable) + deriving (Eq, Ord, Data, Typeable, Generic) instance NFData LocalTime where rnf (LocalTime d t) = rnf d `seq` rnf t `seq` () diff --git a/lib/Data/Time/LocalTime/Internal/TimeOfDay.hs b/lib/Data/Time/LocalTime/Internal/TimeOfDay.hs index b2a9d3ac..6bcf1706 100644 --- a/lib/Data/Time/LocalTime/Internal/TimeOfDay.hs +++ b/lib/Data/Time/LocalTime/Internal/TimeOfDay.hs @@ -25,6 +25,7 @@ import Data.Time.Calendar.Private import Data.Time.Clock.Internal.DiffTime import Data.Time.Clock.Internal.NominalDiffTime import Data.Time.LocalTime.Internal.TimeZone +import GHC.Generics -- | Time of day as represented in hour, minute and second (with picoseconds), typically used to express local time of day. -- @@ -39,7 +40,7 @@ data TimeOfDay = TimeOfDay -- ^ Note that 0 <= 'todSec' < 61, accomodating leap seconds. -- Any local minute may have a leap second, since leap seconds happen in all zones simultaneously } - deriving (Eq, Ord, Data, Typeable) + deriving (Eq, Ord, Data, Typeable, Generic) instance NFData TimeOfDay where rnf (TimeOfDay h m s) = rnf h `seq` rnf m `seq` rnf s `seq` () diff --git a/lib/Data/Time/LocalTime/Internal/TimeZone.hs b/lib/Data/Time/LocalTime/Internal/TimeZone.hs index 69746594..c6d75d0a 100644 --- a/lib/Data/Time/LocalTime/Internal/TimeZone.hs +++ b/lib/Data/Time/LocalTime/Internal/TimeZone.hs @@ -23,6 +23,7 @@ import Data.Time.Clock.POSIX import Data.Time.Clock.System import Foreign import Foreign.C +import GHC.Generics -- | A TimeZone is a whole number of minutes offset from UTC, together with a name and a \"just for summer\" flag. data TimeZone = TimeZone @@ -33,7 +34,7 @@ data TimeZone = TimeZone , timeZoneName :: String -- ^ The name of the zone, typically a three- or four-letter acronym. } - deriving (Eq, Ord, Data, Typeable) + deriving (Eq, Ord, Data, Typeable, Generic) instance NFData TimeZone where rnf (TimeZone m so n) = rnf m `seq` rnf so `seq` rnf n `seq` () diff --git a/lib/Data/Time/LocalTime/Internal/ZonedTime.hs b/lib/Data/Time/LocalTime/Internal/ZonedTime.hs index db476c78..a64f343f 100644 --- a/lib/Data/Time/LocalTime/Internal/ZonedTime.hs +++ b/lib/Data/Time/LocalTime/Internal/ZonedTime.hs @@ -16,6 +16,7 @@ import Data.Time.Clock.Internal.UTCTime import Data.Time.Clock.POSIX import Data.Time.LocalTime.Internal.LocalTime import Data.Time.LocalTime.Internal.TimeZone +import GHC.Generics -- | A local time together with a time zone. -- @@ -26,7 +27,7 @@ data ZonedTime = ZonedTime { zonedTimeToLocalTime :: LocalTime , zonedTimeZone :: TimeZone } - deriving (Data, Typeable) + deriving (Data, Typeable, Generic) instance NFData ZonedTime where rnf (ZonedTime lt z) = rnf lt `seq` rnf z `seq` () diff --git a/time.cabal b/time.cabal index 96573a09..02267e0c 100644 --- a/time.cabal +++ b/time.cabal @@ -44,6 +44,7 @@ library Rank2Types DeriveDataTypeable DeriveLift + DeriveGeneric StandaloneDeriving PatternSynonyms ViewPatterns