on master help sign in
Move Pico conversion code
commitde514776db80770d7d56e0af9c112740f0aea005 authorBryan O'Sullivan <bos@serpentine.com> dateMon 20 Jul 2015, 13:17 (11 years ago) parentb3cb3b0
2 files changed+30−18
Data/Aeson/Functions.hs+27 Data/Aeson/Parser/Time.hs+3−18
Data/Aeson/Functions.hs+27
@@ -1,3 +1,5 @@
1+{-# LANGUAGE CPP #-}
2+
13-- |
24-- Module: Data.Aeson.Functions
35-- Copyright: (c) 2011-2015 Bryan O'Sullivan
@@ -12,12 +14,37 @@ module Data.Aeson.Functions
1214 , hashMapKey
1315 , mapKeyVal
1416 , mapKey
17+ , fromPico
18+ , toPico
1519 ) where
1620
1721import Data.Hashable (Hashable)
1822import qualified Data.HashMap.Strict as H
1923import qualified Data.Map as M
2024
25+#if MIN_VERSION_base(4,7,0)
26+
27+import Data.Fixed (Fixed(MkFixed), Pico)
28+
29+toPico :: Integer -> Pico
30+toPico = MkFixed
31+
32+fromPico :: Pico -> Integer
33+fromPico (MkFixed i) = i
34+
35+#else
36+
37+import Data.Fixed (Pico)
38+import Unsafe.Coerce (unsafeCoerce)
39+
40+toPico :: Integer -> Pico
41+toPico = unsafeCoerce
42+
43+fromPico :: Pico -> Integer
44+fromPico = unsafeCoerce
45+
46+#endif
47+
2148-- | Transform a 'M.Map' into a 'H.HashMap' while transforming the keys.
2249mapHashKeyVal :: (Eq k2, Hashable k2) => (k1 -> k2) -> (v1 -> v2)
2350 -> M.Map k1 v1 -> H.HashMap k2 v2
Data/Aeson/Parser/Time.hs+3−18
@@ -1,4 +1,4 @@
1−{-# LANGUAGE BangPatterns, ScopedTypeVariables, CPP #-}
1+{-# LANGUAGE BangPatterns, ScopedTypeVariables #-}
22
33-- |
44-- Module: Data.Aeson.Parser.Time
@@ -22,6 +22,7 @@ module Data.Aeson.Parser.Time
2222
2323import Control.Applicative ((<$>), (<*>), (<*), (*>))
2424import Control.Monad (when, void)
25+import Data.Aeson.Functions (toPico)
2526import Data.Attoparsec.Text as A
2627import Data.Bits ((.&.))
2728import Data.Char (isDigit, ord)
@@ -35,22 +36,6 @@ import qualified Data.Aeson.Types.Internal as Aeson
3536import qualified Data.Text as T
3637import qualified Data.Time.LocalTime as Local
3738
38−#if MIN_VERSION_base(4,7,0)
39−
40−import Data.Fixed (Fixed(MkFixed))
41−
42−mkPico :: Integer -> Pico
43−mkPico = MkFixed
44−
45−#else
46−
47−import Unsafe.Coerce
48−
49−mkPico :: Integer -> Pico
50−mkPico = unsafeCoerce
51−
52−#endif
53−
5439-- | Run an attoparsec parser as an aeson parser.
5540run :: Parser a -> Text -> Aeson.Parser a
5641run p t = case A.parseOnly (p <* endOfInput) t of
@@ -97,7 +82,7 @@ seconds = do
9782 return $! parsePicos real t
9883 _ -> return $! fromIntegral real
9984 where
100− parsePicos a0 t = mkPico (fromIntegral (t' * 10^n))
85+ parsePicos a0 t = toPico (fromIntegral (t' * 10^n))
10186 where T n t' = T.foldl' step (T 12 (fromIntegral a0)) t
10287 step ma@(T m a) c
10388 | m <= 0 = ma