chronos 1.0.1 → 1.0.2
raw patch · 2 files changed
+68/−9 lines, 2 filesdep ~aesonPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: aeson
API changes (from Hackage documentation)
+ Chronos: decodeOffset :: OffsetFormat -> Text -> Maybe Offset
+ Chronos: decodeOffsetUtf8 :: OffsetFormat -> ByteString -> Maybe Offset
+ Chronos: encodeOffset :: OffsetFormat -> Offset -> Text
+ Chronos: encodeOffsetUtf8 :: OffsetFormat -> Offset -> ByteString
+ Chronos: instance Data.Aeson.Types.FromJSON.FromJSON Chronos.Offset
+ Chronos: instance Data.Aeson.Types.FromJSON.FromJSONKey Chronos.Offset
+ Chronos: instance Data.Aeson.Types.ToJSON.ToJSON Chronos.Datetime
+ Chronos: instance Data.Aeson.Types.ToJSON.ToJSON Chronos.Offset
+ Chronos: instance Data.Aeson.Types.ToJSON.ToJSONKey Chronos.Offset
+ Chronos: instance GHC.Enum.Enum Chronos.Month
Files
- chronos.cabal +2/−5
- src/Chronos.hs +66/−4
chronos.cabal view
@@ -1,5 +1,5 @@ name: chronos-version: 1.0.1+version: 1.0.2 synopsis: A performant time library description: Performance-oriented time library for haskell. The main differences@@ -48,10 +48,7 @@ , text >= 1.2 && < 1.3 , bytestring >= 0.10 && < 0.11 , attoparsec >= 0.13 && < 0.14- -- Remove support for aeson < 1.0 after the newer- -- aeson lands in stackage. Currently, ToJSONKey- -- and FromJSONKey instances cannot be added.- , aeson >= 0.11 && < 1.3+ , aeson >= 1.1 && < 1.3 , hashable >= 1.2 && < 1.3 , primitive >= 0.6 && < 0.7 , torsor >= 0.1 && < 0.2
src/Chronos.hs view
@@ -147,14 +147,21 @@ , builder_YmdIMS_p_z , builder_DmyIMS_p_z , builderW3Cz- , builderOffset- , parserOffset -- *** UTF-8 ByteString , builderUtf8_YmdHMSz , parserUtf8_YmdHMSz , builderUtf8_YmdIMS_p_z , builderUtf8W3Cz+ -- ** Offset+ -- *** Text+ , encodeOffset+ , builderOffset+ , decodeOffset+ , parserOffset+ -- *** UTF-8 ByteString+ , encodeOffsetUtf8 , builderOffsetUtf8+ , decodeOffsetUtf8 , parserOffsetUtf8 -- ** Timespan -- *** Text@@ -204,12 +211,15 @@ import Data.Word (Word64) import Torsor import GHC.Generics (Generic)-import Data.Aeson (FromJSON,ToJSON)+import Data.Aeson (FromJSON,ToJSON,FromJSONKey,ToJSONKey) import Data.Primitive import Foreign.Storable import Data.Hashable (Hashable) import Control.Exception (evaluate) import qualified System.Clock as CLK+import qualified Data.Aeson as AE+import qualified Data.Aeson.Encoding as AEE+import qualified Data.Aeson.Types as AET import qualified Data.Text as Text import qualified Data.Text.Read as Text import qualified Data.Attoparsec.Text as AT@@ -558,7 +568,10 @@ internalMatchMonth :: MonthMatch a -> Month -> a internalMatchMonth (MonthMatch v) (Month ix) = Vector.unsafeIndex v (fromIntegral ix) -daysInMonth :: Bool -> Month -> Int+daysInMonth ::+ Bool -- ^ Is this a leap year?+ -> Month -- ^ Month of year+ -> Int daysInMonth isLeap m = if isLeap then internalMatchMonth leapYearMonthLength m else internalMatchMonth normalYearMonthLength m@@ -1305,6 +1318,9 @@ SubsecondPrecisionAuto (DatetimeFormat (Just '-') (Just 'T') (Just ':')) +encodeOffset :: OffsetFormat -> Offset -> Text+encodeOffset fmt = LT.toStrict . TB.toLazyText . builderOffset fmt+ builderOffset :: OffsetFormat -> Offset -> TB.Builder builderOffset x = case x of OffsetFormatColonOff -> builderOffset_z@@ -1312,6 +1328,10 @@ OffsetFormatSecondsPrecision -> builderOffset_z2 OffsetFormatColonAuto -> builderOffset_z3 +decodeOffset :: OffsetFormat -> Text -> Maybe Offset+decodeOffset fmt =+ either (const Nothing) Just . AT.parseOnly (parserOffset fmt <* AT.endOfInput)+ parserOffset :: OffsetFormat -> Parser Offset parserOffset x = case x of OffsetFormatColonOff -> parserOffset_z@@ -1443,6 +1463,13 @@ SubsecondPrecisionAuto (DatetimeFormat (Just '-') (Just 'T') (Just ':')) +encodeOffsetUtf8 :: OffsetFormat -> Offset -> ByteString+encodeOffsetUtf8 fmt = LB.toStrict . BB.toLazyByteString . builderOffsetUtf8 fmt++decodeOffsetUtf8 :: OffsetFormat -> ByteString -> Maybe Offset+decodeOffsetUtf8 fmt =+ either (const Nothing) Just . AB.parseOnly (parserOffsetUtf8 fmt)+ builderOffsetUtf8 :: OffsetFormat -> Offset -> BB.Builder builderOffsetUtf8 x = case x of OffsetFormatColonOff -> builderOffsetUtf8_z@@ -1749,6 +1776,17 @@ newtype Month = Month { getMonth :: Int } deriving (Show,Read,Eq,Ord,Prim) +instance Enum Month where+ fromEnum = getMonth+ toEnum = Month+ succ (Month x) = if x < 11+ then Month (x + 1)+ else error "Enum.succ{Month}: tried to take succ of December"+ pred (Month x) = if x > 0+ then Month (x - 1)+ else error "Enum.pred{Month}: tried to take succ of January"+ enumFrom x = enumFromTo x (Month 11)+ instance Bounded Month where minBound = Month 0 maxBound = Month 11@@ -2016,4 +2054,28 @@ instance Enum OrdinalDate where fromEnum d = fromEnum (ordinalDateToDay d) toEnum i = dayToOrdinalDate (toEnum i)++instance ToJSON Datetime where+ toJSON = AE.String . encode_YmdHMS SubsecondPrecisionAuto hyphen+ toEncoding x = AEE.unsafeToEncoding (BB.char7 '"' <> builderUtf8_YmdHMS SubsecondPrecisionAuto hyphen x <> BB.char7 '"')++instance ToJSON Offset where+ toJSON = AE.String . encodeOffset OffsetFormatColonOn+ toEncoding x = AEE.unsafeToEncoding (BB.char7 '"' <> builderOffsetUtf8 OffsetFormatColonOn x <> BB.char7 '"')++instance FromJSON Offset where+ parseJSON = AE.withText "Offset" aesonParserOffset++instance ToJSONKey Offset where+ toJSONKey = AE.ToJSONKeyText+ (encodeOffset OffsetFormatColonOn)+ (\x -> AEE.unsafeToEncoding (BB.char7 '"' <> builderOffsetUtf8 OffsetFormatColonOn x <> BB.char7 '"'))++instance FromJSONKey Offset where+ fromJSONKey = AE.FromJSONKeyTextParser aesonParserOffset++aesonParserOffset :: Text -> AET.Parser Offset+aesonParserOffset t = case decodeOffset OffsetFormatColonOn t of+ Nothing -> fail "could not parse Offset"+ Just x -> return x