git.iko.soy/typeable/http-api-data
on master help sign in
Make `ToHttpApiData/FromHttpApiData` instances for `NominalDiffTime`

encode whole range. Add CPP to use `nominalDiffTimeToSeconds` if `time`'s version suffices `nominalDiffTimeToSeconds` was introduced in `time-1.9.1` and has type `nominalDiffTimeToSeconds :: NominalDiffTime -> Pico`, which is what is needed for `toUrlPiece` in `ToHttpApiData`, now that after issue #77 there are instances for types from `Data.Fixed`. As such, if the `time` library's version is high enough, that function will be used. Otherwise, `(realToFrac :: NominalDiffTime -> Pico)` will be used instead.

commit3e87ab069a8c93b003b52bcda557ff52418fba99 authorAlexandre Baldé <alexandrer_b@outlook.com> dateMon 8 Oct 2018, 15:30 (8 years ago) parent94210bc
2 files changed+27−3
src/Web/Internal/HttpApiData.hs+27−2 test/Web/Internal/HttpApiDataSpec.hs−1
src/Web/Internal/HttpApiData.hs+27−2
@@ -39,6 +39,11 @@ import Data.Text.Read (Reader, decimal, rational,
3939
4040import Data.Time
4141import Data.Time.Locale.Compat
42+
43+#if MIN_VERSION_time(1,9,1)
44+import Data.Time (nominalDiffTimeToSeconds, secondsToNominalDiffTime)
45+#endif
46+
4247import Data.Version
4348
4449import Data.Void
@@ -486,8 +491,28 @@ instance ToHttpApiData UTCTime where
486491 toUrlPiece = timeToUrlPiece "%H:%M:%S%QZ"
487492 toEncodedUrlPiece = unsafeToEncodedUrlPiece
488493
494+-- The CPP in both this function and the function after it are to avoid
495+-- exporting @nominalDiffTimeToSeconds@ and @secondsToNominalDiffTime@,
496+-- since these names are already used by @Data.Time@ from the @time@ library
497+-- starting in version @1.9.1@.
498+nominalDiffTimeToSecs :: NominalDiffTime -> F.Pico
499+nominalDiffTimeToSecs =
500+#if !MIN_VERSION_time(1,9,1)
501+ realToFrac
502+#else
503+ nominalDiffTimeToSeconds
504+#endif
505+
506+secsToNominalDiffTime :: F.Pico -> NominalDiffTime
507+secsToNominalDiffTime =
508+#if !MIN_VERSION_time(1,9,1)
509+ realToFrac
510+#else
511+ secondsToNominalDiffTime
512+#endif
513+
489514instance ToHttpApiData NominalDiffTime where
490− toUrlPiece = toUrlPiece . (floor :: NominalDiffTime -> Integer)
515+ toUrlPiece = toUrlPiece . nominalDiffTimeToSecs
491516 toEncodedUrlPiece = unsafeToEncodedUrlPiece
492517
493518instance ToHttpApiData String where toUrlPiece = T.pack
@@ -630,7 +655,7 @@ instance FromHttpApiData ZonedTime where parseUrlPiece = runAtto Atto.zonedTime
630655-- Right 2015-10-03 00:14:24 UTC
631656instance FromHttpApiData UTCTime where parseUrlPiece = runAtto Atto.utcTime
632657
633−instance FromHttpApiData NominalDiffTime where parseUrlPiece = fmap fromInteger . parseUrlPiece
658+instance FromHttpApiData NominalDiffTime where parseUrlPiece = fmap secsToNominalDiffTime . parseUrlPiece
634659
635660instance FromHttpApiData All where parseUrlPiece = fmap All . parseUrlPiece
636661instance FromHttpApiData Any where parseUrlPiece = fmap Any . parseUrlPiece
test/Web/Internal/HttpApiDataSpec.hs−1
@@ -1,4 +1,3 @@
1−{-# LANGUAGE CPP #-}
21{-# LANGUAGE ScopedTypeVariables #-}
32module Web.Internal.HttpApiDataSpec (spec) where
43