packages feed

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