crjdt-haskell 0.1.0.0 → 0.2.0.0
raw patch · 5 files changed
+56/−5 lines, 5 filesdep ~basenew-component:exe:examplesPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: base
API changes (from Hackage documentation)
- Data.Crjdt: sync :: (ReplicaId, Command ()) -> (ReplicaId, Command ()) -> IO (Eval (), Eval ())
+ Data.Crjdt: sync :: (ReplicaId, Command ()) -> (ReplicaId, Command ()) -> Either EvalError (Eval (), Eval ())
Files
- CHANGELOG.md +7/−0
- README.md +7/−1
- crjdt-haskell.cabal +9/−1
- examples/Main.hs +31/−0
- src/Data/Crjdt.hs +2/−3
+ CHANGELOG.md view
@@ -0,0 +1,7 @@+0.0.2++* BREAKING CHANGE: helper function sync is not IO anymore++0.0.1++* Initial release
README.md view
@@ -4,11 +4,16 @@ *crjdt-haskell* provides high level interface to CRDT which is formalised in the [paper](https://arxiv.org/pdf/1608.03960v1.pdf) by Martin Kleppmann and Alastair R. Beresford. +## Documentation++See [haddocks](https://hackage.haskell.org/package/crjdt-haskell).+ ## Example ```haskell {-# LANGUAGE OverloadedStrings #-}+ module Main where import Data.Crjdt as C@@ -32,7 +37,7 @@ main :: IO () main = do -- Sync first and second replica- (r1, r2) <- sync (1, replica1) (2, replica2)+ let Right (r1, r2) = sync (1, replica1) (2, replica2) let replica1' = execEval 1 r1 replica2' = execEval 2 r2@@ -44,6 +49,7 @@ ## Future work +* Improve documentation * Aeson support * Simplify API as described in [second version](https://arxiv.org/abs/1608.03960) of the paper
crjdt-haskell.cabal view
@@ -1,5 +1,5 @@ name: crjdt-haskell-version: 0.1.0.0+version: 0.2.0.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,6 +13,7 @@ cabal-version: >=1.10 extra-source-files: README.md+ , CHANGELOG.md library hs-source-dirs: src@@ -42,6 +43,13 @@ 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 view
@@ -0,0 +1,31 @@+{-# 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
@@ -47,7 +47,6 @@ import Data.Set (Set) import Data.Void import Data.Function-import Control.Exception (throwIO) import Control.Monad.Free (liftF) import Data.Crjdt.Context as Core@@ -147,7 +146,7 @@ ----------------------------------------------------------------------------------------------- -- Utility functions -sync :: (ReplicaId, Command ()) -> (ReplicaId, Command ()) -> IO (Eval (), Eval ())+sync :: (ReplicaId, Command ()) -> (ReplicaId, Command ()) -> Either EvalError (Eval (), Eval ()) sync (rid1, first) (rid2, second) = let (rFirst, sFirst) = run rid1 (Eval.execute first) (rSecond, sSecond) = run rid2 (Eval.execute second)@@ -157,4 +156,4 @@ Eval.execute yield in case (rFirst *> rSecond) of Right () -> pure $ (synced first sSecond, synced second sFirst)- Left ex -> throwIO ex+ Left ex -> Left ex