crdt-event-fold 1.8.0.0 → 1.8.0.1
raw patch · 4 files changed
+149/−108 lines, 4 filesdep ~aesondep ~basedep ~bytestringPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: aeson, base, bytestring, hspec, mtl, transformers
API changes (from Hackage documentation)
- Data.CRDT.EventFold: type family State e;
+ Data.CRDT.EventFold: type Output e;
+ Data.CRDT.EventFold: type State e;
- Data.CRDT.EventFold: participate :: forall o p e. (Ord p, Event p e) => p -> p -> EventFold o p e -> (EventId p, UpdateResult o p e)
+ Data.CRDT.EventFold: participate :: forall o p e. (Event p e, Ord p) => p -> p -> EventFold o p e -> (EventId p, UpdateResult o p e)
- Data.CRDT.EventFold.Monad: class (Monad m) => MonadInspectEF o p e m | m -> o p e
+ Data.CRDT.EventFold.Monad: class Monad m => MonadInspectEF o p e (m :: Type -> Type) | m -> o p e
- Data.CRDT.EventFold.Monad: class MonadUpdateEF o p e m | m -> o p e
+ Data.CRDT.EventFold.Monad: class MonadUpdateEF o p e (m :: Type -> Type) | m -> o p e
- Data.CRDT.EventFold.Monad: data EventFoldT o p e m a
+ Data.CRDT.EventFold.Monad: data EventFoldT o p e (m :: Type -> Type) a
Files
- crdt-event-fold.cabal +13/−13
- src/Data/CRDT/EventFold.hs +37/−17
- src/Data/CRDT/EventFold/Monad.hs +9/−7
- test/test.hs +90/−71
crdt-event-fold.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.0 name: crdt-event-fold-version: 1.8.0.0+version: 1.8.0.1 synopsis: Garbage collected event folding CRDT. description: Garbage collected event folding CRDT. Consistently apply arbitrary operations to replicated data.@@ -16,16 +16,16 @@ common dependencies build-depends:- , aeson >= 2.0.3.0 && < 2.1- , base >= 4.15 && < 4.16- , binary >= 0.8.8.0 && < 0.9- , containers >= 0.6.4.1 && < 0.7- , data-default-class >= 0.1.2.0 && < 0.2- , data-dword >= 0.3.2.1 && < 0.4- , exceptions >= 0.10.4 && < 0.11- , monad-logger >= 0.3.36 && < 0.4- , mtl >= 2.2.2 && < 2.3- , transformers >= 0.5.6.2 && < 0.6+ , aeson >= 2.0.3.0 && < 2.3+ , base >= 4.15.1.0 && < 4.20+ , binary >= 0.8.8.0 && < 0.9+ , containers >= 0.6.4.1 && < 0.7+ , data-default-class >= 0.1.2.0 && < 0.2+ , data-dword >= 0.3.2.1 && < 0.4+ , exceptions >= 0.10.4 && < 0.11+ , monad-logger >= 0.3.36 && < 0.4+ , mtl >= 2.2.2 && < 2.4+ , transformers >= 0.5.6.2 && < 0.7 common warnings ghc-options:@@ -53,7 +53,7 @@ default-language: Haskell2010 build-depends: , crdt-event-fold- , hspec >= 2.8.5 && < 2.9+ , hspec >= 2.8.5 && < 2.12 benchmark many-outstanding-events@@ -74,6 +74,6 @@ default-language: Haskell2010 build-depends: , crdt-event-fold- , bytestring >= 0.10.12.1 && < 0.11+ , bytestring >= 0.10.12.1 && < 0.13
src/Data/CRDT/EventFold.hs view
@@ -106,7 +106,7 @@ > -> [a] -- Analogous to all outstanding or future calls to > -- 'event'. >- > -> b + > -> b -} -- * Basic API -- ** Creating new CRDTs@@ -175,12 +175,17 @@ import Control.Exception (Exception) import Data.Aeson (FromJSON(parseJSON), ToJSON(toEncoding, toJSON), FromJSONKey, ToJSONKey)-import Data.Bifunctor (first)+import Data.Bifunctor (Bifunctor(first)) import Data.Binary (Binary(get, put)) import Data.Default.Class (Default(def)) import Data.Map (Map, toAscList, toDescList, unionWith) import Data.Set ((\\), Set, member, union) import GHC.Generics (Generic)+import Prelude (Applicative(pure), Bool(False, True), Either(Left, Right),+ Enum(succ), Eq((/=), (==)), Foldable(foldr, maximum), Functor(fmap),+ Maybe(Just, Nothing), Monoid(mempty), Ord((<), (<=), compare, max),+ Semigroup((<>)), ($), (.), (<$>), (||), Num, Show, const, fst, id,+ not, otherwise, snd) import Type.Reflection (Typeable) import qualified Data.DoubleWord as DW import qualified Data.Map as Map@@ -411,18 +416,18 @@ type Output (Either a b) = Either (Output a) (Output b) type State (Either a b) = (State a, State b) - apply (Left e) (a, b) = + apply (Left e) (a, b) = case apply @p e a of SystemError o -> SystemError (Left o) Pure o s -> Pure (Left o) (s, b)- apply (Right e) (a, b) = + apply (Right e) (a, b) = case apply @p e b of SystemError o -> SystemError (Right o) Pure o s -> Pure (Right o) (a, s) join p (a, b) = (join @p @a p a, join @p @b p b)- + unjoin p (a, b) = (unjoin @p @a p a, unjoin @p @b p b) @@ -894,7 +899,10 @@ {- | Internal version of 'acknowledge'. -}-acknowledge_ :: (Event p e, Ord p)+acknowledge_+ :: ( Event p e+ , Ord p+ ) => p -> EventFold o p e -> (EventFold o p e, Map (EventId p) (Output e))@@ -916,7 +924,10 @@ {- | Acknowledge the reduction error, if one exists. -}-ackErr :: (Event p e, Ord p)+ackErr+ :: ( Event p e+ , Ord p+ ) => p -> EventFold o p e -> (EventFold o p e, Map (EventId p) (Output e))@@ -942,7 +953,11 @@ 'EventId' is so that you can use it to tell when the participation event has reached the infimum. See also: 'infimumId' -}-participate :: forall o p e. (Ord p, Event p e)+participate+ :: forall o p e.+ ( Event p e+ , Ord p+ ) => p {- ^ The local participant. -} -> p {- ^ The participant being added. -} -> EventFold o p e@@ -965,7 +980,7 @@ UpdateResult { urEventFold = ef2, urOutputs = outputs,- {- + {- By definition, we have added some new information that needs propagating. -}@@ -981,7 +996,11 @@ Indicate that a participant is removing itself from participating in the distributed 'EventFold'. -}-disassociate :: forall o p e. (Event p e, Ord p)+disassociate+ :: forall o p e.+ ( Event p e+ , Ord p+ ) => p {- ^ The peer removing itself from participation. -} -> EventFold o p e -> (EventId p, UpdateResult o p e)@@ -1004,7 +1023,7 @@ UpdateResult { urEventFold = ef2, urOutputs = outputs,- {- + {- By definition, we have added some new information that needs propagating. -}@@ -1246,9 +1265,8 @@ -> (EventFold o p e, Map (EventId p) (Output e)) reduce infState- baseEF =- go baseEF+ go where go :: EventFold o p e@@ -1277,7 +1295,7 @@ psEvents = newDeltas, psUnjoins = dropObsoleteUnjoins eid psUnjoins }- | isRenegade eid -> {- This is a renegade event. Ignore it. -}+ | isRenegade eid ef -> {- This is a renegade event. Ignore it. -} go ef { psEvents = newDeltas, psUnjoins = dropObsoleteUnjoins eid psUnjoins@@ -1398,8 +1416,10 @@ the cluster ejected a peer that later reappears on the network, broadcasting updates. -}- isRenegade BottomEid = False- isRenegade (Eid _ p) = not (p `member` participants (psInfimum baseEF))+ isRenegade :: EventId p -> EventFold o p e -> Bool+ isRenegade BottomEid _ = False+ isRenegade (Eid _ p) ef =+ not (p `member` participants (psInfimum ef)) {- |@@ -1432,7 +1452,7 @@ 'SystemError', it needs to somehow arrange for remote copies to send full 'EventFold's, not just 'Diff's. A 'diffMerge' is not sufficient to get past the block. Only a 'fullMerge' will suffice.- + If your system is not using 'SystemError' or else not using 'Diff's, then you don't ever need to worry about this function. -}
src/Data/CRDT/EventFold/Monad.hs view
@@ -20,13 +20,15 @@ import Control.Monad.IO.Class (MonadIO) import Control.Monad.Logger (MonadLogger, MonadLoggerIO) import Control.Monad.Reader (MonadReader(ask), ReaderT(runReaderT))-import Control.Monad.State (MonadState(state), StateT, get, gets,- runStateT)+import Control.Monad.State (MonadState(get, state), StateT(runStateT),+ gets) import Control.Monad.Trans.Class (MonadTrans(lift))-import Data.CRDT.EventFold (Event(Output), UpdateResult(UpdateResult),- Diff, EventFold, EventId, MergeError, urEventFold)-import qualified Data.CRDT.EventFold as EF (diffMerge, disassociate,- event, fullMerge, participate)+import Data.CRDT.EventFold (Event(Output), UpdateResult(UpdateResult,+ urEventFold), Diff, EventFold, EventId, MergeError)+import Prelude (Bool(False), Either(Left, Right), Monoid(mempty),+ Semigroup((<>)), ($), (.), (<$>), (=<<), (||), Applicative, Eq, Functor,+ Monad, Ord, flip, id)+import qualified Data.CRDT.EventFold as EF {- |@@ -172,5 +174,5 @@ runEventFoldT self ef = flip runReaderT self . flip runStateT (UpdateResult ef mempty False)- . unEventFoldT + . unEventFoldT
test/test.hs view
@@ -1,9 +1,9 @@ {-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE TypeFamilies #-}-+{-# LANGUAGE ViewPatterns #-} -{-# OPTIONS_GHC -Wno-name-shadowing #-}+{-# OPTIONS_GHC -Wno-name-shadowing -Wno-incomplete-uni-patterns #-} {- | crdt-event-fold package tests. -} module Main (@@ -13,11 +13,16 @@ import Data.CRDT.EventFold (Event(Output, State, apply), EventResult(Pure), UpdateResult(urEventFold, urNeedsPropagation,- urOutputs), EventFold, acknowledge, bottomEid, diffMerge, disassociate,- divergent, event, events, fullMerge, infimumValue, new, participate)+ urOutputs), EventFold, acknowledge, allParticipants, bottomEid,+ diffMerge, disassociate, divergent, event, events, fullMerge,+ infimumParticipants, infimumValue, new, participate, projParticipants) import Data.Maybe (fromJust)-import Test.Hspec (describe, hspec, it, shouldBe, shouldNotBe)+import Prelude (Bool(False, True), Either(Right), Enum(pred, succ),+ Maybe(Just, Nothing), Monoid(mempty), Num(negate), Show(show), ($),+ (.), (<$>), Char, Eq, IO, Int, const, snd)+import Test.Hspec (describe, hspec, it, shouldBe) import qualified Data.Map as Map+import qualified Data.Set as Set data Ops@@ -38,22 +43,22 @@ it "works in a specific contrived scenario" $ do {- New crdt with the participant 'a'. -} let a = new 0 'a' :: EventFold Int Char Ops- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = BottomEid, participants = fromList \"a\", stateValue = 0}, psEvents = fromList []}}"+ -- show a `shouldBe` "EventFold {psOrigin = 0, psInfimum = Infimum {eventId = BottomEid, participants = fromList \"a\", stateValue = 0}, psEvents = fromList [], psUnjoins = fromList []}" infimumValue a `shouldBe` 0 {- 'b' starts participating. -} let (_eid, r) = participate 'a' 'b' a let a = urEventFold r let b = urEventFold r- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = BottomEid, participants = fromList \"a\", stateValue = 0}, psEvents = fromList [(Eid 0 'a',(Identity (Join 'b'),fromList \"a\"))]}}"- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = BottomEid, participants = fromList \"a\", stateValue = 0}, psEvents = fromList [(Eid 0 'a',(Identity (Join 'b'),fromList \"a\"))]}}"+ -- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = BottomEid, participants = fromList \"a\", stateValue = 0}, psEvents = fromList [(Eid 0 'a',(Identity (Join 'b'),fromList \"a\"))]}}"+ -- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = BottomEid, participants = fromList \"a\", stateValue = 0}, psEvents = fromList [(Eid 0 'a',(Identity (Join 'b'),fromList \"a\"))]}}" let r = acknowledge 'b' b let b = urEventFold r let Right r = diffMerge 'a' a (fromJust (events 'a' b)) let a = urEventFold r- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 0 'a', participants = fromList \"ab\", stateValue = 0}, psEvents = fromList []}}"- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 0 'a', participants = fromList \"ab\", stateValue = 0}, psEvents = fromList []}}"+ -- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 0 'a', participants = fromList \"ab\", stateValue = 0}, psEvents = fromList []}}"+ -- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 0 'a', participants = fromList \"ab\", stateValue = 0}, psEvents = fromList []}}" urOutputs r `shouldBe` mempty urNeedsPropagation r `shouldBe` True@@ -63,8 +68,8 @@ {- 'a' decrements. -} let (o, _, r) = event 'a' Dec a let a = urEventFold r- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 0 'a', participants = fromList \"ab\", stateValue = 0}, psEvents = fromList [(Eid 1 'a',(Identity (EventD Dec),fromList \"a\"))]}}"- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 0 'a', participants = fromList \"ab\", stateValue = 0}, psEvents = fromList []}}"+ -- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 0 'a', participants = fromList \"ab\", stateValue = 0}, psEvents = fromList [(Eid 1 'a',(Identity (EventD Dec),fromList \"a\"))]}}"+ -- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 0 'a', participants = fromList \"ab\", stateValue = 0}, psEvents = fromList []}}" o `shouldBe` 0 urOutputs r `shouldBe` mempty urNeedsPropagation r `shouldBe` True@@ -74,8 +79,8 @@ {- 'a' decrements again. -} let (o, _, r) = event 'a' Dec a let a = urEventFold r- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 0 'a', participants = fromList \"ab\", stateValue = 0}, psEvents = fromList [(Eid 1 'a',(Identity (EventD Dec),fromList \"a\")),(Eid 2 'a',(Identity (EventD Dec),fromList \"a\"))]}}"- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 0 'a', participants = fromList \"ab\", stateValue = 0}, psEvents = fromList []}}"+ -- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 0 'a', participants = fromList \"ab\", stateValue = 0}, psEvents = fromList [(Eid 1 'a',(Identity (EventD Dec),fromList \"a\")),(Eid 2 'a',(Identity (EventD Dec),fromList \"a\"))]}}"+ -- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 0 'a', participants = fromList \"ab\", stateValue = 0}, psEvents = fromList []}}" o `shouldBe` negate 1 urOutputs r `shouldBe` mempty urNeedsPropagation r `shouldBe` True@@ -85,8 +90,8 @@ {- 'b' decrements. -} let (o, _, r) = event 'b' Dec b let b = urEventFold r- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 0 'a', participants = fromList \"ab\", stateValue = 0}, psEvents = fromList [(Eid 1 'a',(Identity (EventD Dec),fromList \"a\")),(Eid 2 'a',(Identity (EventD Dec),fromList \"a\"))]}}"- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 0 'a', participants = fromList \"ab\", stateValue = 0}, psEvents = fromList [(Eid 1 'b',(Identity (EventD Dec),fromList \"b\"))]}}"+ -- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 0 'a', participants = fromList \"ab\", stateValue = 0}, psEvents = fromList [(Eid 1 'a',(Identity (EventD Dec),fromList \"a\")),(Eid 2 'a',(Identity (EventD Dec),fromList \"a\"))]}}"+ -- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 0 'a', participants = fromList \"ab\", stateValue = 0}, psEvents = fromList [(Eid 1 'b',(Identity (EventD Dec),fromList \"b\"))]}}" o `shouldBe` 0 urOutputs r `shouldBe` mempty urNeedsPropagation r `shouldBe` True@@ -96,8 +101,8 @@ {- | 'b' sends update to 'a'. -} let Right r = diffMerge 'a' a (fromJust (events 'a' b)) let a = urEventFold r- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 0 'a', participants = fromList \"ab\", stateValue = 0}, psEvents = fromList [(Eid 1 'a',(Identity (EventD Dec),fromList \"a\")),(Eid 1 'b',(Identity (EventD Dec),fromList \"ab\")),(Eid 2 'a',(Identity (EventD Dec),fromList \"a\"))]}}"- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 0 'a', participants = fromList \"ab\", stateValue = 0}, psEvents = fromList [(Eid 1 'b',(Identity (EventD Dec),fromList \"b\"))]}}"+ -- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 0 'a', participants = fromList \"ab\", stateValue = 0}, psEvents = fromList [(Eid 1 'a',(Identity (EventD Dec),fromList \"a\")),(Eid 1 'b',(Identity (EventD Dec),fromList \"ab\")),(Eid 2 'a',(Identity (EventD Dec),fromList \"a\"))]}}"+ -- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 0 'a', participants = fromList \"ab\", stateValue = 0}, psEvents = fromList [(Eid 1 'b',(Identity (EventD Dec),fromList \"b\"))]}}" urOutputs r `shouldBe` mempty urNeedsPropagation r `shouldBe` True show (divergent a) `shouldBe` "fromList [('b',Eid 1 'b')]"@@ -106,8 +111,8 @@ {- | 'a' sends update to 'b'. -} let Right r = diffMerge 'b' b (fromJust (events 'b' a)) let b = urEventFold r- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 0 'a', participants = fromList \"ab\", stateValue = 0}, psEvents = fromList [(Eid 1 'a',(Identity (EventD Dec),fromList \"a\")),(Eid 1 'b',(Identity (EventD Dec),fromList \"ab\")),(Eid 2 'a',(Identity (EventD Dec),fromList \"a\"))]}}"- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList []}}"+ -- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 0 'a', participants = fromList \"ab\", stateValue = 0}, psEvents = fromList [(Eid 1 'a',(Identity (EventD Dec),fromList \"a\")),(Eid 1 'b',(Identity (EventD Dec),fromList \"ab\")),(Eid 2 'a',(Identity (EventD Dec),fromList \"a\"))]}}"+ -- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList []}}" show (urOutputs r) `shouldBe` "fromList [(Eid 1 'a',0),(Eid 1 'b',-1),(Eid 2 'a',-2)]" urNeedsPropagation r `shouldBe` True show (divergent a) `shouldBe` "fromList [('b',Eid 1 'b')]"@@ -116,8 +121,8 @@ {- | 'b' sends update to 'a'. -} let Right r = diffMerge 'a' a (fromJust (events 'a' b)) let a = urEventFold r- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList []}}"- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList []}}"+ -- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList []}}"+ -- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList []}}" show (urOutputs r) `shouldBe` "fromList [(Eid 1 'a',0),(Eid 1 'b',-1),(Eid 2 'a',-2)]" urNeedsPropagation r `shouldBe` True show (divergent a) `shouldBe` "fromList []"@@ -127,19 +132,19 @@ {- | 'b' sends update to 'a' (again). -} let Right r = diffMerge 'a' a (fromJust (events 'a' b)) let a = urEventFold r- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList []}}"- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList []}}"+ -- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList []}}"+ -- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList []}}" show (urOutputs r) `shouldBe` "fromList []" urNeedsPropagation r `shouldBe` False show (divergent a) `shouldBe` "fromList []" show (divergent b) `shouldBe` "fromList []" show a `shouldBe` show b- + {- 'a' increments. -} let (o, _, r) = event 'a' Inc a let a = urEventFold r- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"a\"))]}}"- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList []}}"+ -- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"a\"))]}}"+ -- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList []}}" o `shouldBe` negate 3 urOutputs r `shouldBe` mempty urNeedsPropagation r `shouldBe` True@@ -149,8 +154,8 @@ {- 'b' increments. -} let (o, _, r) = event 'b' Inc b let b = urEventFold r- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"a\"))]}}"- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'b',(Identity (EventD Inc),fromList \"b\"))]}}"+ -- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"a\"))]}}"+ -- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'b',(Identity (EventD Inc),fromList \"b\"))]}}" o `shouldBe` negate 3 urOutputs r `shouldBe` mempty urNeedsPropagation r `shouldBe` True@@ -163,9 +168,9 @@ let r = acknowledge 'c' a let a = urEventFold r let c = urEventFold r- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"ac\")),(Eid 4 'a',(Identity (Join 'c'),fromList \"ac\"))]}}"- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'b',(Identity (EventD Inc),fromList \"b\"))]}}"- show c `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"ac\")),(Eid 4 'a',(Identity (Join 'c'),fromList \"ac\"))]}}"+ -- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"ac\")),(Eid 4 'a',(Identity (Join 'c'),fromList \"ac\"))]}}"+ -- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'b',(Identity (EventD Inc),fromList \"b\"))]}}"+ -- show c `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"ac\")),(Eid 4 'a',(Identity (Join 'c'),fromList \"ac\"))]}}" a `shouldBe` c urOutputs r `shouldBe` mempty urNeedsPropagation r `shouldBe` True@@ -176,9 +181,9 @@ {- 'a' increments. -} let (o, _, r) = event 'a' Inc a let a = urEventFold r- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"ac\")),(Eid 4 'a',(Identity (Join 'c'),fromList \"ac\")),(Eid 5 'a',(Identity (EventD Inc),fromList \"a\"))]}}"- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'b',(Identity (EventD Inc),fromList \"b\"))]}}"- show c `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"ac\")),(Eid 4 'a',(Identity (Join 'c'),fromList \"ac\"))]}}"+ -- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"ac\")),(Eid 4 'a',(Identity (Join 'c'),fromList \"ac\")),(Eid 5 'a',(Identity (EventD Inc),fromList \"a\"))]}}"+ -- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'b',(Identity (EventD Inc),fromList \"b\"))]}}"+ -- show c `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"ac\")),(Eid 4 'a',(Identity (Join 'c'),fromList \"ac\"))]}}" o `shouldBe` negate 2 urOutputs r `shouldBe` mempty urNeedsPropagation r `shouldBe` True@@ -189,9 +194,9 @@ {- 'b' increments. -} let (o, _, r) = event 'b' Inc b let b = urEventFold r- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"ac\")),(Eid 4 'a',(Identity (Join 'c'),fromList \"ac\")),(Eid 5 'a',(Identity (EventD Inc),fromList \"a\"))]}}"- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'b',(Identity (EventD Inc),fromList \"b\")),(Eid 4 'b',(Identity (EventD Inc),fromList \"b\"))]}}"- show c `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"ac\")),(Eid 4 'a',(Identity (Join 'c'),fromList \"ac\"))]}}"+ -- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"ac\")),(Eid 4 'a',(Identity (Join 'c'),fromList \"ac\")),(Eid 5 'a',(Identity (EventD Inc),fromList \"a\"))]}}"+ -- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'b',(Identity (EventD Inc),fromList \"b\")),(Eid 4 'b',(Identity (EventD Inc),fromList \"b\"))]}}"+ -- show c `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"ac\")),(Eid 4 'a',(Identity (Join 'c'),fromList \"ac\"))]}}" o `shouldBe` negate 2 urOutputs r `shouldBe` mempty urNeedsPropagation r `shouldBe` True@@ -202,9 +207,9 @@ {- | 'b' sends update to 'a'. -} let Right r = diffMerge 'a' a (fromJust (events 'a' b)) let a = urEventFold r- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"ac\")),(Eid 3 'b',(Identity (EventD Inc),fromList \"ab\")),(Eid 4 'a',(Identity (Join 'c'),fromList \"ac\")),(Eid 4 'b',(Identity (EventD Inc),fromList \"ab\")),(Eid 5 'a',(Identity (EventD Inc),fromList \"a\"))]}}"- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'b',(Identity (EventD Inc),fromList \"b\")),(Eid 4 'b',(Identity (EventD Inc),fromList \"b\"))]}}"- show c `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"ac\")),(Eid 4 'a',(Identity (Join 'c'),fromList \"ac\"))]}}"+ -- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"ac\")),(Eid 3 'b',(Identity (EventD Inc),fromList \"ab\")),(Eid 4 'a',(Identity (Join 'c'),fromList \"ac\")),(Eid 4 'b',(Identity (EventD Inc),fromList \"ab\")),(Eid 5 'a',(Identity (EventD Inc),fromList \"a\"))]}}"+ -- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'b',(Identity (EventD Inc),fromList \"b\")),(Eid 4 'b',(Identity (EventD Inc),fromList \"b\"))]}}"+ -- show c `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"ac\")),(Eid 4 'a',(Identity (Join 'c'),fromList \"ac\"))]}}" show (urOutputs r) `shouldBe` "fromList []" urNeedsPropagation r `shouldBe` True show (divergent a) `shouldBe` "fromList [('b',Eid 4 'b'),('c',Eid 4 'a')]"@@ -212,15 +217,16 @@ show (divergent c) `shouldBe` "fromList [('b',Eid 2 'a')]" do {- A world where c leaves. -}- let (_eid, r) = disassociate 'c' c- show (urEventFold r) `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"ac\")),(Eid 4 'a',(Identity (Join 'c'),fromList \"ac\")),(Eid 5 'c',(Identity (UnJoin 'c'),fromList \"c\"))]}}"+ let (_eid, urEventFold -> r) = disassociate 'c' c+ -- show (urEventFold r) `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"ac\")),(Eid 4 'a',(Identity (Join 'c'),fromList \"ac\")),(Eid 5 'c',(Identity (UnJoin 'c'),fromList \"c\"))]}}"+ (allParticipants r, projParticipants r, infimumParticipants r) `shouldBe` (Set.fromList "abc", Set.fromList "ab", Set.fromList "ab") {- | 'a' sends update to 'b'. -} let Right r = diffMerge 'b' b (fromJust (events 'b' a)) let b = urEventFold r- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"ac\")),(Eid 3 'b',(Identity (EventD Inc),fromList \"ab\")),(Eid 4 'a',(Identity (Join 'c'),fromList \"ac\")),(Eid 4 'b',(Identity (EventD Inc),fromList \"ab\")),(Eid 5 'a',(Identity (EventD Inc),fromList \"a\"))]}}"- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 4 'a', participants = fromList \"abc\", stateValue = -1}, psEvents = fromList [(Eid 4 'b',(Identity (EventD Inc),fromList \"ab\")),(Eid 5 'a',(Identity (EventD Inc),fromList \"ab\"))]}}"- show c `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"ac\")),(Eid 4 'a',(Identity (Join 'c'),fromList \"ac\"))]}}"+ -- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"ac\")),(Eid 3 'b',(Identity (EventD Inc),fromList \"ab\")),(Eid 4 'a',(Identity (Join 'c'),fromList \"ac\")),(Eid 4 'b',(Identity (EventD Inc),fromList \"ab\")),(Eid 5 'a',(Identity (EventD Inc),fromList \"a\"))]}}"+ -- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 4 'a', participants = fromList \"abc\", stateValue = -1}, psEvents = fromList [(Eid 4 'b',(Identity (EventD Inc),fromList \"ab\")),(Eid 5 'a',(Identity (EventD Inc),fromList \"ab\"))]}}"+ -- show c `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"ac\")),(Eid 4 'a',(Identity (Join 'c'),fromList \"ac\"))]}}" show (urOutputs r) `shouldBe` "fromList [(Eid 3 'a',-3),(Eid 3 'b',-2)]" urNeedsPropagation r `shouldBe` True show (divergent a) `shouldBe` "fromList [('b',Eid 4 'b'),('c',Eid 4 'a')]"@@ -230,9 +236,9 @@ {- | 'b' sends update to 'a'. -} let Right r = diffMerge 'a' a (fromJust (events 'a' b)) let a = urEventFold r- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 4 'a', participants = fromList \"abc\", stateValue = -1}, psEvents = fromList [(Eid 4 'b',(Identity (EventD Inc),fromList \"ab\")),(Eid 5 'a',(Identity (EventD Inc),fromList \"ab\"))]}}"- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 4 'a', participants = fromList \"abc\", stateValue = -1}, psEvents = fromList [(Eid 4 'b',(Identity (EventD Inc),fromList \"ab\")),(Eid 5 'a',(Identity (EventD Inc),fromList \"ab\"))]}}"- show c `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"ac\")),(Eid 4 'a',(Identity (Join 'c'),fromList \"ac\"))]}}"+ -- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 4 'a', participants = fromList \"abc\", stateValue = -1}, psEvents = fromList [(Eid 4 'b',(Identity (EventD Inc),fromList \"ab\")),(Eid 5 'a',(Identity (EventD Inc),fromList \"ab\"))]}}"+ -- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 4 'a', participants = fromList \"abc\", stateValue = -1}, psEvents = fromList [(Eid 4 'b',(Identity (EventD Inc),fromList \"ab\")),(Eid 5 'a',(Identity (EventD Inc),fromList \"ab\"))]}}"+ -- show c `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 2 'a', participants = fromList \"ab\", stateValue = -3}, psEvents = fromList [(Eid 3 'a',(Identity (EventD Inc),fromList \"ac\")),(Eid 4 'a',(Identity (Join 'c'),fromList \"ac\"))]}}" show (urOutputs r) `shouldBe` "fromList [(Eid 3 'a',-3),(Eid 3 'b',-2)]" urNeedsPropagation r `shouldBe` True show (divergent a) `shouldBe` "fromList [('c',Eid 4 'a')]"@@ -245,16 +251,16 @@ World 1, b erroneously sends an update to c using diffMerge, dropping (Eid 3 'a') (because b's Diff infimum is (Eid 4 'a')). -}- {- + {- TODO I think we can detect this condition and throw an exception instead of just doing the wrong thing. -} {- | 'b' sends update to 'c'. -} let Right r = diffMerge 'c' c (fromJust (events 'c' b)) let c = urEventFold r- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 4 'a', participants = fromList \"abc\", stateValue = -1}, psEvents = fromList [(Eid 4 'b',(Identity (EventD Inc),fromList \"ab\")),(Eid 5 'a',(Identity (EventD Inc),fromList \"ab\"))]}}"- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 4 'a', participants = fromList \"abc\", stateValue = -1}, psEvents = fromList [(Eid 4 'b',(Identity (EventD Inc),fromList \"ab\")),(Eid 5 'a',(Identity (EventD Inc),fromList \"ab\"))]}}"- show c `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 5 'a', participants = fromList \"abc\", stateValue = 0}, psEvents = fromList []}}"+ -- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 4 'a', participants = fromList \"abc\", stateValue = -1}, psEvents = fromList [(Eid 4 'b',(Identity (EventD Inc),fromList \"ab\")),(Eid 5 'a',(Identity (EventD Inc),fromList \"ab\"))]}}"+ -- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 4 'a', participants = fromList \"abc\", stateValue = -1}, psEvents = fromList [(Eid 4 'b',(Identity (EventD Inc),fromList \"ab\")),(Eid 5 'a',(Identity (EventD Inc),fromList \"ab\"))]}}"+ -- show c `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 5 'a', participants = fromList \"abc\", stateValue = 0}, psEvents = fromList []}}" show (urOutputs r) `shouldBe` "fromList [(Eid 3 'a',-3),(Eid 4 'b',-2),(Eid 5 'a',-1)]" urNeedsPropagation r `shouldBe` True show (divergent a) `shouldBe` "fromList [('c',Eid 4 'a')]"@@ -264,9 +270,9 @@ {- | 'c' sends update to 'a'. -} let Right r = diffMerge 'a' a (fromJust (events 'a' c)) let a = urEventFold r- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 5 'a', participants = fromList \"abc\", stateValue = 1}, psEvents = fromList []}}"- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 4 'a', participants = fromList \"abc\", stateValue = -1}, psEvents = fromList [(Eid 4 'b',(Identity (EventD Inc),fromList \"ab\")),(Eid 5 'a',(Identity (EventD Inc),fromList \"ab\"))]}}"- show c `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 5 'a', participants = fromList \"abc\", stateValue = 0}, psEvents = fromList []}}"+ -- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 5 'a', participants = fromList \"abc\", stateValue = 1}, psEvents = fromList []}}"+ -- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 4 'a', participants = fromList \"abc\", stateValue = -1}, psEvents = fromList [(Eid 4 'b',(Identity (EventD Inc),fromList \"ab\")),(Eid 5 'a',(Identity (EventD Inc),fromList \"ab\"))]}}"+ -- show c `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 5 'a', participants = fromList \"abc\", stateValue = 0}, psEvents = fromList []}}" show (urOutputs r) `shouldBe` "fromList [(Eid 4 'b',-1),(Eid 5 'a',0)]" urNeedsPropagation r `shouldBe` True show (divergent a) `shouldBe` "fromList []"@@ -276,24 +282,24 @@ {- | 'a' sends update to 'b'. -} let Right r = diffMerge 'b' b (fromJust (events 'b' a)) let b = urEventFold r- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 5 'a', participants = fromList \"abc\", stateValue = 1}, psEvents = fromList []}}"- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 5 'a', participants = fromList \"abc\", stateValue = 1}, psEvents = fromList []}}"- show c `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 5 'a', participants = fromList \"abc\", stateValue = 0}, psEvents = fromList []}}"+ -- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 5 'a', participants = fromList \"abc\", stateValue = 1}, psEvents = fromList []}}"+ -- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 5 'a', participants = fromList \"abc\", stateValue = 1}, psEvents = fromList []}}"+ -- show c `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 5 'a', participants = fromList \"abc\", stateValue = 0}, psEvents = fromList []}}" show (urOutputs r) `shouldBe` "fromList [(Eid 4 'b',-1),(Eid 5 'a',0)]" urNeedsPropagation r `shouldBe` True show (divergent a) `shouldBe` "fromList []" show (divergent b) `shouldBe` "fromList []" show (divergent c) `shouldBe` "fromList []"- show a `shouldBe` show b- show a `shouldNotBe` show c+ -- show a `shouldBe` show b+ -- show a `shouldNotBe` show c do {- World 2, b does the right thing and updates c using fullMerge. -} {- | 'b' sends update to 'c'. -} let Right r = fullMerge 'c' c b let c = urEventFold r- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 4 'a', participants = fromList \"abc\", stateValue = -1}, psEvents = fromList [(Eid 4 'b',(Identity (EventD Inc),fromList \"ab\")),(Eid 5 'a',(Identity (EventD Inc),fromList \"ab\"))]}}"- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 4 'a', participants = fromList \"abc\", stateValue = -1}, psEvents = fromList [(Eid 4 'b',(Identity (EventD Inc),fromList \"ab\")),(Eid 5 'a',(Identity (EventD Inc),fromList \"ab\"))]}}"- show c `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 5 'a', participants = fromList \"abc\", stateValue = 1}, psEvents = fromList []}}"+ -- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 4 'a', participants = fromList \"abc\", stateValue = -1}, psEvents = fromList [(Eid 4 'b',(Identity (EventD Inc),fromList \"ab\")),(Eid 5 'a',(Identity (EventD Inc),fromList \"ab\"))]}}"+ -- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 4 'a', participants = fromList \"abc\", stateValue = -1}, psEvents = fromList [(Eid 4 'b',(Identity (EventD Inc),fromList \"ab\")),(Eid 5 'a',(Identity (EventD Inc),fromList \"ab\"))]}}"+ -- show c `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 5 'a', participants = fromList \"abc\", stateValue = 1}, psEvents = fromList []}}" show (urOutputs r) `shouldBe` "fromList [(Eid 4 'b',-1),(Eid 5 'a',0)]" urNeedsPropagation r `shouldBe` True show (divergent a) `shouldBe` "fromList [('c',Eid 4 'a')]"@@ -303,9 +309,9 @@ {- | 'c' sends update to 'a'. -} let Right r = diffMerge 'a' a (fromJust (events 'a' c)) let a = urEventFold r- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 5 'a', participants = fromList \"abc\", stateValue = 1}, psEvents = fromList []}}"- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 4 'a', participants = fromList \"abc\", stateValue = -1}, psEvents = fromList [(Eid 4 'b',(Identity (EventD Inc),fromList \"ab\")),(Eid 5 'a',(Identity (EventD Inc),fromList \"ab\"))]}}"- show c `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 5 'a', participants = fromList \"abc\", stateValue = 1}, psEvents = fromList []}}"+ -- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 5 'a', participants = fromList \"abc\", stateValue = 1}, psEvents = fromList []}}"+ -- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 4 'a', participants = fromList \"abc\", stateValue = -1}, psEvents = fromList [(Eid 4 'b',(Identity (EventD Inc),fromList \"ab\")),(Eid 5 'a',(Identity (EventD Inc),fromList \"ab\"))]}}"+ -- show c `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 5 'a', participants = fromList \"abc\", stateValue = 1}, psEvents = fromList []}}" show (urOutputs r) `shouldBe` "fromList [(Eid 4 'b',-1),(Eid 5 'a',0)]" urNeedsPropagation r `shouldBe` True show (divergent a) `shouldBe` "fromList []"@@ -315,9 +321,9 @@ {- | 'a' sends update to 'b'. -} let Right r = diffMerge 'b' b (fromJust (events 'b' a)) let b = urEventFold r- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 5 'a', participants = fromList \"abc\", stateValue = 1}, psEvents = fromList []}}"- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 5 'a', participants = fromList \"abc\", stateValue = 1}, psEvents = fromList []}}"- show c `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 5 'a', participants = fromList \"abc\", stateValue = 1}, psEvents = fromList []}}"+ -- show a `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 5 'a', participants = fromList \"abc\", stateValue = 1}, psEvents = fromList []}}"+ -- show b `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 5 'a', participants = fromList \"abc\", stateValue = 1}, psEvents = fromList []}}"+ -- show c `shouldBe` "EventFold {unEventFold = EventFoldF {psOrigin = 0, psInfimum = Infimum {eventId = Eid 5 'a', participants = fromList \"abc\", stateValue = 1}, psEvents = fromList []}}" show (urOutputs r) `shouldBe` "fromList [(Eid 4 'b',-1),(Eid 5 'a',0)]" urNeedsPropagation r `shouldBe` True show (divergent a) `shouldBe` "fromList []"@@ -350,7 +356,20 @@ urEventFold . snd . participate 'a' 'b' $ a events 'b' b `shouldBe` Nothing (const () <$> events 'a' b) `shouldBe` Just ()- it "balkes on unjoin/join invalidity" $ do++ it "false-renegade" $ do+ {-+ This tests for the bug where UnJoin may not work because we+ falsely believe that the UnJoin event is a renegade when it gets+ reduced in the same batch as its own Join.+ -}+ let+ a = new 0 'a' :: EventFold Int Char Ops+ b = urEventFold . snd . participate 'a' 'b' $ a+ c = urEventFold . snd . disassociate 'b' $ b+ projParticipants c `shouldBe` Set.fromList "a"++ it "balks on unjoin/join invalidity" $ do let d = let