chronologique 0.2.1.0 → 0.3.0.0
raw patch · 4 files changed
+92/−8 lines, 4 filesdep +vectorPVP ok
version bump matches the API change (PVP)
Dependencies added: vector
API changes (from Hackage documentation)
+ Chrono.TimeStamp: instance Data.Vector.Generic.Base.Vector Data.Vector.Unboxed.Base.Vector Chrono.TimeStamp.TimeStamp
+ Chrono.TimeStamp: instance Data.Vector.Generic.Mutable.Base.MVector Data.Vector.Unboxed.Base.MVector Chrono.TimeStamp.TimeStamp
+ Chrono.TimeStamp: instance Data.Vector.Unboxed.Base.Unbox Chrono.TimeStamp.TimeStamp
Files
- chronologique.cabal +6/−5
- lib/Chrono/TimeStamp.hs +49/−1
- tests/CheckVectorOperations.hs +32/−0
- tests/TestSuite.hs +5/−2
chronologique.cabal view
@@ -1,6 +1,6 @@ cabal-version: >= 1.10 name: chronologique-version: 0.2.1.0+version: 0.3.0.0 synopsis: Time to manipulate time description: A simple type useful for representing timestamps as generated by system@@ -32,7 +32,8 @@ build-depends: base >= 4.9 && < 5, time,- hourglass+ hourglass,+ vector hs-source-dirs: lib @@ -57,7 +58,6 @@ main-is: Experiment.hs ghc-options: -threaded- -O2 -Wall -Wwarn -fwarn-tabs@@ -71,16 +71,17 @@ hspec, hourglass, QuickCheck,+ vector, chronologique hs-source-dirs: tests main-is: TestSuite.hs - other-modules: CheckTimeStamp+ other-modules: CheckTimeStamp,+ CheckVectorOperations ghc-options: -threaded- -O2 -Wall -Wwarn -fwarn-tabs
lib/Chrono/TimeStamp.hs view
@@ -1,7 +1,7 @@ -- -- Time to manipulate time ----- Copyright © 2013-2016 Operational Dynamics Consulting, Pty Ltd and Others+-- Copyright © 2013-2017 Operational Dynamics Consulting, Pty Ltd and Others -- -- The code in this file, and the program it is a part of, is -- made available to you by its authors as open source software:@@ -12,6 +12,9 @@ {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE InstanceSigs #-} {-# LANGUAGE TupleSections #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE TypeFamilies #-} module Chrono.TimeStamp (@@ -25,6 +28,9 @@ import Data.Maybe import Data.Int (Int64) import Data.Hourglass+import qualified Data.Vector.Generic as G+import qualified Data.Vector.Generic.Mutable as M+import Data.Vector.Unboxed import Time.System import Chrono.Formats@@ -129,3 +135,45 @@ convertToTimeStamp :: ElapsedP -> TimeStamp convertToTimeStamp = timeFromElapsedP++{-+ Ideally both the existing G.Vector Vector Int64 and M.MVector MVector+ Int64 instances would be sufficient to support automatically deriving+ those things for TimeStamp. But, *gaboom* somewhere down in GHC.Prim;+ writing this gumpf out manually did the trick, and satisifies the+ superclass requirements to derive an Unbox instance.+-}++newtype instance MVector s TimeStamp = MV_TimeStamp (MVector s Int64)+newtype instance Vector TimeStamp = V_TimeStamp (Vector Int64)++instance G.Vector Vector TimeStamp where+ basicUnsafeFreeze (MV_TimeStamp v) = V_TimeStamp <$> G.basicUnsafeFreeze v+ basicUnsafeThaw (V_TimeStamp v) = MV_TimeStamp <$> G.basicUnsafeThaw v+ basicLength (V_TimeStamp v) = G.basicLength v+ basicUnsafeSlice j k (V_TimeStamp v) = V_TimeStamp $ G.basicUnsafeSlice j k v+ basicUnsafeIndexM (V_TimeStamp v) i = TimeStamp <$> G.basicUnsafeIndexM v i+ {-# INLINE basicUnsafeFreeze #-}+ {-# INLINE basicUnsafeThaw #-}+ {-# INLINE basicLength #-}+ {-# INLINE basicUnsafeSlice #-}+ {-# INLINE basicUnsafeIndexM #-}++instance M.MVector MVector TimeStamp where+ basicLength (MV_TimeStamp v) = M.basicLength v+ basicUnsafeSlice j k (MV_TimeStamp v) = MV_TimeStamp $ M.basicUnsafeSlice j k v+ basicOverlaps (MV_TimeStamp a) (MV_TimeStamp b) = M.basicOverlaps a b+ basicUnsafeNew n = MV_TimeStamp <$> M.basicUnsafeNew n+ basicInitialize (MV_TimeStamp v) = M.basicInitialize v+ basicUnsafeRead (MV_TimeStamp v) i = TimeStamp <$> M.basicUnsafeRead v i+ basicUnsafeWrite (MV_TimeStamp v) i (TimeStamp a) = M.basicUnsafeWrite v i a+ {-# INLINE basicLength #-}+ {-# INLINE basicUnsafeSlice #-}+ {-# INLINE basicOverlaps #-}+ {-# INLINE basicUnsafeNew #-}+ {-# INLINE basicInitialize #-}+ {-# INLINE basicUnsafeRead #-}+ {-# INLINE basicUnsafeWrite #-}++deriving instance Unbox TimeStamp+
+ tests/CheckVectorOperations.hs view
@@ -0,0 +1,32 @@+--+-- Time to manipulate time+--+-- Copyright © 2013-2017 Operational Dynamics Consulting, Pty Ltd and Others+--+-- The code in this file, and the program it is a part of, is+-- made available to you by its authors as open source software:+-- you can redistribute it and/or modify it under the terms of+-- the 3-clause BSD licence.+--++-- | Test unboxed vector usage++module CheckVectorOperations where++import Data.Vector.Unboxed (Vector)+import qualified Data.Vector.Unboxed as V+import Test.Hspec+import Test.QuickCheck++import Chrono.TimeStamp++checkVectorUnboxed :: Spec+checkVectorUnboxed = do+ describe "Unbox instance for TimeStamp" $+ it "should work in an unboxed Vector" $ do+ let vs = V.fromList [minBound, 0, maxBound] :: Vector TimeStamp+ show vs `shouldBe`+ "[1677-09-21T00:12:43.145224192Z" +++ ",1970-01-01T00:00:00.000000000Z" +++ ",2262-04-11T23:47:16.854775807Z]"+
tests/TestSuite.hs view
@@ -5,11 +5,14 @@ import Test.Hspec import CheckTimeStamp+import CheckVectorOperations main :: IO ()-main = hspec suite+main = do+ hspec suite+ putStrLn "." suite :: Spec suite = do checkTimeStamp-+ checkVectorUnboxed