packages feed

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 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]