crjdt-haskell 0.2.1 → 0.3.0
raw patch · 8 files changed
+26/−66 lines, 8 filesdep ~basePVP ok
version bump matches the API change (PVP)
Dependency ranges changed: base
API changes (from Hackage documentation)
- Data.Crjdt: infixl 4 .>
- Data.Crjdt.Context: setFinalKey :: Key Void -> Cursor -> Cursor
- Data.Crjdt.Context: setPath :: Seq (Key Tag) -> Cursor -> Cursor
+ Data.Crjdt: infixl 6 .>
- Data.Crjdt: eval :: Ctx m => Expr -> m Result
+ Data.Crjdt: eval :: Ctx m => Expr -> m Cursor
- Data.Crjdt.Eval: eval :: Ctx m => Expr -> m Result
+ Data.Crjdt.Eval: eval :: Ctx m => Expr -> m Cursor
Files
- CHANGELOG.md +5/−0
- README.md +8/−8
- crjdt-haskell.cabal +2/−9
- examples/Main.hs +0/−31
- src/Data/Crjdt.hs +1/−1
- src/Data/Crjdt/Context.hs +0/−2
- src/Data/Crjdt/Eval.hs +10/−14
- src/Data/Crjdt/Types.hs +0/−1
CHANGELOG.md view
@@ -1,3 +1,8 @@+0.3.0++* BREAKING CHANGE: Remove unnecessarry exports+* BREAKING CHANGE: Fix fixity of (.>), it now binds more tightly than (=:)+ 0.2.1 * Generalize helper function sync
README.md view
@@ -13,25 +13,22 @@ ```haskell {-# LANGUAGE OverloadedStrings #-}+ module Main where import Data.Crjdt as C -- Original state original :: Command ()-original = (doc .> key "key") =: "A"+original = doc .> key "key" =: "A" -- First replica updates doc["key"] to "B" replica1 :: Command ()-replica1 = do- original- (doc .> key "key") =: "B"+replica1 = original *> doc .> key "key" =: "B" -- Second replica updates doc["key"] to "C" replica2 :: Command ()-replica2 = do- original- (doc .> key "key") =: "C"+replica2 = original *> doc .> key "key" =: "C" main :: IO () main = do@@ -43,7 +40,6 @@ -- Both replicas converge to: {"key": {"B", "C"}} print (document replica1' == document replica2') -- True- ``` ## Future work@@ -51,6 +47,10 @@ * Improve documentation * Aeson support * Simplify API as described in [second version](https://arxiv.org/abs/1608.03960) of the paper++## Other implementations++* [Scala CRJDT](https://github.com/fthomas/crjdt) ## LICENSE
crjdt-haskell.cabal view
@@ -1,5 +1,5 @@ name: crjdt-haskell-version: 0.2.1+version: 0.3.0 synopsis: A Conflict-Free Replicated JSON Datatype for Haskell description: A Conflict-Free Replicated JSON Datatype for Haskell homepage: https://github.com/amarpotghan/crjdt-haskell#readme@@ -13,7 +13,7 @@ cabal-version: >=1.10 extra-source-files: README.md- , CHANGELOG.md + , CHANGELOG.md library hs-source-dirs: src@@ -43,13 +43,6 @@ ghc-options: -threaded -rtsopts -with-rtsopts=-N other-modules: Data.CrjdtSpec , Data.FigureSpec- default-language: Haskell2010--executable examples- main-is: Main.hs- hs-source-dirs: examples- build-depends: base >= 4.7 && < 5- , crjdt-haskell default-language: Haskell2010 source-repository head
− examples/Main.hs
@@ -1,31 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}-module Main where--import Data.Crjdt as C---- Original state-original :: Command ()-original = (doc .> key "key") =: "A"---- First replica updates doc["key"] to "B"-replica1 :: Command ()-replica1 = do- original- (doc .> key "key") =: "B"---- Second replica updates doc["key"] to "C"-replica2 :: Command ()-replica2 = do- original- (doc .> key "key") =: "C"--main :: IO ()-main = do- -- Sync first and second replica- let Right (r1, r2) = sync (1, replica1) (2, replica2)-- let replica1' = execEval 1 r1- replica2' = execEval 2 r2-- -- Both replicas converge to: {"key": {"B", "C"}}- print (document replica1' == document replica2') -- True
src/Data/Crjdt.hs view
@@ -62,7 +62,7 @@ (.>) :: b -> (b -> a) -> a (.>) = (&) -infixl 4 .>+infixl 6 .> -- |'emptyMap' corresponds to {}. emptyMap :: Val
src/Data/Crjdt/Context.hs view
@@ -26,8 +26,6 @@ , findChild , applyOp , getPresence- , setPath- , setFinalKey , lookupCtx , appendWith , docKey
src/Data/Crjdt/Eval.hs view
@@ -44,17 +44,15 @@ instance Exception EvalError newtype Eval a = Eval- { runEval :: ExceptT EvalError (State Context) a- } deriving- ( Functor- , Applicative- , Monad- , MonadFix- , MonadError EvalError- , MonadState Context- )--type Result = Cursor+ { runEval :: ExceptT EvalError (State Context) a }+ deriving+ ( Functor+ , Applicative+ , Monad+ , MonadFix+ , MonadError EvalError+ , MonadState Context+ ) initial :: ReplicaId -> Context initial rid = Context@@ -115,7 +113,6 @@ , history = Set.insert (opId op) (history cc) } in traverse_ applyRemote' (received c)-{-# INLINE applyRemote #-} applyLocal :: Ctx m => Mutation -> Cursor -> m () applyLocal mut cur = modify $ \c ->@@ -130,9 +127,8 @@ , history = Set.insert (opId op) (history c) , queue = queue c Seq.|> op }-{-# INLINE applyLocal #-} -eval :: Ctx m => Expr -> m Result+eval :: Ctx m => Expr -> m Cursor eval Doc = pure $ Cursor Seq.empty $ unTag docKey eval (GetKey expr k) = do cursor <- eval expr
src/Data/Crjdt/Types.hs view
@@ -66,7 +66,6 @@ sequenceNumber = fst . getId replicaNumber = snd . getId- mkId sn rid = Id (sn, rid) tagWith :: tag -> BasicKey -> Key tag