equivalence 0.3.2 → 0.3.3
raw patch · 2 files changed
+20/−17 lines, 2 filesdep ~basePVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: base
API changes (from Hackage documentation)
- Data.Equivalence.Monad: class (Monad m, Applicative m, Ord v) => MonadEquiv c v d m | m -> v, m -> c, m -> d where equate x y = equateAll [x, y] combine x y = combineAll [x, y] >> return x
+ Data.Equivalence.Monad: class (Monad m, Applicative m, Ord v) => MonadEquiv c v d m | m -> v, m -> c, m -> d
Files
- equivalence.cabal +4/−4
- src/Data/Equivalence/STT.hs +16/−13
equivalence.cabal view
@@ -1,9 +1,9 @@ Name: equivalence-Version: 0.3.2+Version: 0.3.3 License: BSD3 License-File: LICENSE Author: Patrick Bahr-Maintainer: paba@di.ku.dk+Maintainer: paba@itu.dk Homepage: https://github.com/pa-ba/equivalence bug-reports: https://github.com/pa-ba/equivalence/issues/new Synopsis: Maintaining an equivalence relation implemented as union-find using STT.@@ -34,12 +34,12 @@ Other-Modules: Data.Equivalence.Monad_Test hs-source-dirs: src testsuite/tests Build-Depends: base >= 4, template-haskell, containers, mtl >= 2.0.1, QuickCheck >= 2,- test-framework, test-framework-quickcheck2, STMonadTrans,+ test-framework, test-framework-quickcheck2, STMonadTrans >= 0.4.3, transformers >= 0.2, transformers-compat >= 0.3 Library Build-Depends:- base >= 4 && < 5, containers, mtl >= 2.0.1, STMonadTrans >= 0.4.1,+ base >= 4 && < 5, containers, mtl >= 2.0.1, STMonadTrans >= 0.4.3, transformers >= 0.2, transformers-compat >= 0.3 Exposed-Modules: Data.Equivalence.STT,
src/Data/Equivalence/STT.hs view
@@ -249,20 +249,23 @@ equateEntry :: (Monad m, Applicative m, Ord a) => Equiv s c a -> Entry s c a -> Entry s c a -> STT s m (Entry s c a) equateEntry Equiv {combDesc = mkDesc} repx@(Entry rx) repy@(Entry ry) = if (rx /= ry) then do- dx@Root{entryWeight = wx, entryDesc = chx, entryValue = vx} <- readSTRef rx- dy@Root{entryWeight = wy, entryDesc = chy, entryValue = vy} <- readSTRef ry- if wx >= wy- then do- writeSTRef ry Node {entryParent = repx, entryValue = vy}- writeSTRef rx dx{entryWeight = wx + wy, entryDesc = mkDesc chx chy}- return repx- else do- writeSTRef rx Node {entryParent = repy, entryValue = vx}- writeSTRef ry dy{entryWeight = wx + wy, entryDesc = mkDesc chx chy}- return repy- else return repx-+ dx <- readSTRef rx+ dy <- readSTRef ry+ case (dx, dy) of+ ( Root{entryWeight = wx, entryDesc = chx, entryValue = vx}+ , Root{entryWeight = wy, entryDesc = chy, entryValue = vy} ) ->+ if wx >= wy+ then do+ writeSTRef ry Node {entryParent = repx, entryValue = vy}+ writeSTRef rx dx{entryWeight = wx + wy, entryDesc = mkDesc chx chy}+ return repx+ else do+ writeSTRef rx Node {entryParent = repy, entryValue = vx}+ writeSTRef ry dy{entryWeight = wx + wy, entryDesc = mkDesc chx chy}+ return repy + _ -> fail "error on `equateEntry`"+ else return repx combineEntries :: (Monad m, Applicative m, Ord a) => Equiv s c a -> [b] -> (b -> STT s m (Entry s c a)) -> STT s m ()