packages feed

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