summaryrefslogtreecommitdiff
path: root/src/Erebos/Storage/Merge.hs
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2025-08-02 13:50:08 +0200
committerRoman Smrž <roman.smrz@seznam.cz>2025-08-02 18:43:28 +0200
commit49bc432662cb952dc0b2604ff729d1e5931eb6bd (patch)
treeac462b7dab26151e82768302f3137531e9d58be2 /src/Erebos/Storage/Merge.hs
parent8b4e0de1aa5a9f1e2da66ba9ab89f24040f6aded (diff)
Function to compute symmetric difference between stored histories
Diffstat (limited to 'src/Erebos/Storage/Merge.hs')
-rw-r--r--src/Erebos/Storage/Merge.hs17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/Erebos/Storage/Merge.hs b/src/Erebos/Storage/Merge.hs
index 873a6b1..8221e91 100644
--- a/src/Erebos/Storage/Merge.hs
+++ b/src/Erebos/Storage/Merge.hs
@@ -17,6 +17,8 @@ module Erebos.Storage.Merge (
findProperty,
findPropertyFirst,
+
+ storedDifference,
) where
import Control.Concurrent.MVar
@@ -172,3 +174,18 @@ findPropertyFirst sel = fmap (fromJust . sel . fromStored) . listToMaybe . filte
findPropHeads :: forall a b. Storable a => (a -> Maybe b) -> Stored a -> [Stored a]
findPropHeads sel sobj | Just _ <- sel $ fromStored sobj = [sobj]
| otherwise = findPropHeads sel =<< previous sobj
+
+
+-- | Compute symmetrict difference between two stored histories. In other
+-- words, return all 'Stored a' objects reachable (via 'previous') from first
+-- given set, but not from the second; and vice versa.
+storedDifference :: Storable a => [ Stored a ] -> [ Stored a ] -> [ Stored a ]
+storedDifference xs' ys' =
+ let xs = filterAncestors xs'
+ ys = filterAncestors ys'
+
+ filteredPrevious blocked zs = filterAncestors (previous zs ++ blocked) `diffSorted` blocked
+ xg = S.toAscList $ NE.last $ generationsBy (filteredPrevious ys) $ filterAncestors (xs ++ ys) `diffSorted` ys
+ yg = S.toAscList $ NE.last $ generationsBy (filteredPrevious xs) $ filterAncestors (ys ++ xs) `diffSorted` xs
+
+ in xg `mergeUniq` yg