crdt 0.2 → 0.3
raw patch · 5 files changed
+29/−41 lines, 5 filesdep +containersdep −vectorPVP ok
version bump matches the API change (PVP)
Dependencies added: containers
Dependencies removed: vector
API changes (from Hackage documentation)
- CRDT.GCounter.Cv.Internal: GCounter :: (Vector a) -> GCounter a
+ CRDT.GCounter.Cv.Internal: GCounter :: (IntMap a) -> GCounter a
Files
- crdt.cabal +4/−4
- lib/CRDT/GCounter/Cv.hs +8/−15
- lib/CRDT/GCounter/Cv/Internal.hs +4/−4
- test/Instances/Cv.hs +2/−7
- test/Main.hs +11/−11
crdt.cabal view
@@ -1,9 +1,9 @@--- This file has been generated from package.yaml by hpack version 0.17.0.+-- This file has been generated from package.yaml by hpack version 0.17.1. -- -- see: https://github.com/sol/hpack name: crdt-version: 0.2+version: 0.3 synopsis: Conflict-free replicated data types description: Definitions of CmRDT and CvRDT. Implementations for some classic CRDTs. category: Distributed Systems@@ -24,7 +24,7 @@ lib build-depends: base >= 4.9 && < 4.10- , vector+ , containers exposed-modules: CRDT.Cm CRDT.Cv@@ -45,7 +45,7 @@ test build-depends: base >= 4.9 && < 4.10- , vector+ , containers , QuickCheck , tasty , tasty-quickcheck
lib/CRDT/GCounter/Cv.hs view
@@ -6,11 +6,9 @@ , increment ) where -import Data.Monoid ((<>))-import qualified Data.Vector as Vector-import qualified Data.Vector.Mutable as VectorM+import qualified Data.IntMap.Strict as IntMap -import CRDT.GCounter.Cv.Internal+import CRDT.GCounter.Cv.Internal -- | Increment counter increment@@ -18,21 +16,16 @@ => Word -- ^ replica id -> GCounter a -> GCounter a-increment replicaId (GCounter vec) = let+increment replicaId (GCounter imap) = GCounter (IntMap.insertWith (+) i 1 imap)+ where i = fromIntegral replicaId- vecResized =- if i + 1 > length vec then- vec <> Vector.replicate (i + 1 - length vec) 0- else- vec- vecUpdated = Vector.modify (\vm -> VectorM.modify vm (+1) i) vecResized- in- GCounter vecUpdated -- | Initial state initial :: GCounter a-initial = GCounter Vector.empty+initial = GCounter IntMap.empty -- | Get value from the state query :: Num a => GCounter a -> a-query (GCounter v) = sum v+query (GCounter v) = mapSum v+ where+ mapSum = IntMap.foldr (+) 0
lib/CRDT/GCounter/Cv/Internal.hs view
@@ -1,16 +1,16 @@ module CRDT.GCounter.Cv.Internal where import Data.Semigroup (Semigroup ((<>)))-import Data.Vector (Vector)-import qualified Data.Vector as Vector+import Data.IntMap.Strict (IntMap)+import qualified Data.IntMap.Strict as IntMap import CRDT.Cv (CvRDT) -- | Grow-only counter.-newtype GCounter a = GCounter (Vector a)+newtype GCounter a = GCounter (IntMap a) deriving (Eq, Show) instance Ord a => Semigroup (GCounter a) where- GCounter x <> GCounter y = GCounter $ Vector.zipWith max x y+ GCounter x <> GCounter y = GCounter $ IntMap.unionWith max x y instance Ord a => CvRDT (GCounter a)
test/Instances/Cv.hs view
@@ -5,15 +5,10 @@ module Instances.Cv () where -import Data.Vector (Vector)-import qualified Data.Vector as Vector import Test.QuickCheck (Arbitrary, arbitrary) -import CRDT.GCounter.Cv.Internal (GCounter (..))-import CRDT.PNCounter.Cv.Internal (PNCounter (..))--instance Arbitrary a => Arbitrary (Vector a) where- arbitrary = Vector.fromList <$> arbitrary+import CRDT.GCounter.Cv.Internal (GCounter (..))+import CRDT.PNCounter.Cv.Internal (PNCounter (..)) deriving instance Arbitrary a => Arbitrary (GCounter a)
test/Main.hs view
@@ -1,21 +1,21 @@ {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE ScopedTypeVariables #-} -import Data.Proxy (Proxy (..))-import Data.Semilattice (Semilattice, (<>))-import Test.QuickCheck (Arbitrary, Small (..))-import Test.Tasty (TestTree, defaultMain, testGroup)-import Test.Tasty.QuickCheck (testProperty)+import Data.Proxy (Proxy (..))+import Data.Semilattice (Semilattice, (<>))+import Test.QuickCheck (Arbitrary, Small (..))+import Test.Tasty (TestTree, defaultMain, testGroup)+import Test.Tasty.QuickCheck (testProperty) -import CRDT.Cm (CmRDT, State)-import qualified CRDT.Cm as Cm-import CRDT.Cv (CvRDT)-import qualified CRDT.GCounter.Cv as GcCv-import CRDT.LWW (LWW)+import CRDT.Cm (CmRDT, State)+import qualified CRDT.Cm as Cm+import CRDT.Cv (CvRDT)+import qualified CRDT.GCounter.Cv as GcCv+import CRDT.LWW (LWW) import qualified CRDT.PNCounter.Cm as PncCm import qualified CRDT.PNCounter.Cv as PncCv -import Instances ()+import Instances () main :: IO () main = defaultMain $ testGroup "" [gCounter, pnCounter, lww]