From 696d3dc74bc65aa93bfbd533f5cf62294ac7725b Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Tue, 16 Sep 2025 15:19:13 -0500 Subject: [PATCH] Add named values for positive and negative infinity --- .../Database/PostgreSQL/Simple/Interval.hs | 2 ++ .../PostgreSQL/Simple/Interval/Unstable.hs | 20 ++++++++++++++++--- source/test-suite/Main.hs | 8 ++++++++ 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/source/library/Database/PostgreSQL/Simple/Interval.hs b/source/library/Database/PostgreSQL/Simple/Interval.hs index bd88c98..127a837 100644 --- a/source/library/Database/PostgreSQL/Simple/Interval.hs +++ b/source/library/Database/PostgreSQL/Simple/Interval.hs @@ -3,6 +3,8 @@ module Database.PostgreSQL.Simple.Interval -- * Construction Unstable.zero, + Unstable.infinity, + Unstable.negativeInfinity, Unstable.fromMicroseconds, Unstable.fromMilliseconds, Unstable.fromSeconds, diff --git a/source/library/Database/PostgreSQL/Simple/Interval/Unstable.hs b/source/library/Database/PostgreSQL/Simple/Interval/Unstable.hs index 6f0cb15..4786694 100644 --- a/source/library/Database/PostgreSQL/Simple/Interval/Unstable.hs +++ b/source/library/Database/PostgreSQL/Simple/Interval/Unstable.hs @@ -98,6 +98,20 @@ instance Persist.PersistFieldSql Interval where zero :: Interval zero = MkInterval 0 0 0 +-- | The biggest possible interval. +-- +-- >>> infinity +-- MkInterval {months = 2147483647, days = 2147483647, microseconds = 9223372036854775807} +infinity :: Interval +infinity = MkInterval maxBound maxBound maxBound + +-- | The smallest possible interval. +-- +-- >>> negativeInfinity +-- MkInterval {months = -2147483648, days = -2147483648, microseconds = -9223372036854775808} +negativeInfinity :: Interval +negativeInfinity = MkInterval minBound minBound minBound + -- | Creates an interval from a number of microseconds. -- -- >>> fromMicroseconds 1 @@ -605,9 +619,9 @@ parseInfinities = -- `infinity` is new as of PostgreSQL 17.0. -- https://www.postgresql.org/message-id/E1r2rB1-005PHm-UL%40gemulon.postgresql.org A.choice - [ MkInterval minBound minBound minBound <$ "-infinity", - MkInterval maxBound maxBound maxBound <$ "+infinity", - MkInterval maxBound maxBound maxBound <$ "infinity" + [ negativeInfinity <$ "-infinity", + infinity <$ "+infinity", + infinity <$ "infinity" ] parseIso8601 :: A.Parser [Component] diff --git a/source/test-suite/Main.hs b/source/test-suite/Main.hs index ec7427a..558f3da 100644 --- a/source/test-suite/Main.hs +++ b/source/test-suite/Main.hs @@ -28,6 +28,14 @@ spec = H.describe "Database.PostgreSQL.Simple.Interval" $ do H.it "works" $ do I.zero `H.shouldBe` I.MkInterval 0 0 0 + H.describe "infinity" $ do + H.it "works" $ do + I.infinity `H.shouldBe` I.MkInterval maxBound maxBound maxBound + + H.describe "negativeInfinity" $ do + H.it "works" $ do + I.negativeInfinity `H.shouldBe` I.MkInterval minBound minBound minBound + H.describe "add" $ do H.it "succeeds with no overflow" $ do let actual = I.add (I.MkInterval 1 2 3) (I.MkInterval 4 5 6)