unimap 0.1.0 → 0.1.1
raw patch · 3 files changed
+204/−2 lines, 3 filesdep ~prop-unitPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: prop-unit
API changes (from Hackage documentation)
+ Unimap: singleton :: Coercible k Int => k -> v -> UnionMap k v
+ Unimap.Find: ChangedNo :: Changed
+ Unimap.Find: ChangedYes :: Changed
+ Unimap.Find: Equiv :: !IntLikeMap k (IntLikeSet k) -> !IntLikeMap k k -> Equiv k
+ Unimap.Find: InsertResAdded :: !UnionFind k -> InsertRes k
+ Unimap.Find: InsertResDuplicate :: InsertRes k
+ Unimap.Find: InsertValDuplicate :: InsertVal
+ Unimap.Find: InsertValInserted :: InsertVal
+ Unimap.Find: LookupResFound :: !k -> !IntLikeSet k -> !Maybe (UnionFind k) -> LookupRes k
+ Unimap.Find: LookupResMissing :: !k -> LookupRes k
+ Unimap.Find: LookupValMissing :: !k -> LookupVal k
+ Unimap.Find: LookupValOk :: !k -> !IntLikeSet k -> !Changed -> LookupVal k
+ Unimap.Find: MergeResMerged :: !k -> !IntLikeSet k -> !UnionFind k -> MergeRes k
+ Unimap.Find: MergeResMissing :: !k -> MergeRes k
+ Unimap.Find: MergeValMerged :: !k -> !IntLikeSet k -> MergeVal k
+ Unimap.Find: MergeValMissing :: !k -> MergeVal k
+ Unimap.Find: [equivBwd] :: Equiv k -> !IntLikeMap k k
+ Unimap.Find: [equivFwd] :: Equiv k -> !IntLikeMap k (IntLikeSet k)
+ Unimap.Find: compact :: Coercible k Int => UnionFind k -> (IntLikeMap k k, UnionFind k)
+ Unimap.Find: compactLM :: (Coercible k Int, MonadState s m) => UnionFindLens s k -> m (IntLikeMap k k)
+ Unimap.Find: compactM :: (Coercible k Int, MonadState (UnionFind k) m) => m (IntLikeMap k k)
+ Unimap.Find: data Changed
+ Unimap.Find: data Equiv k
+ Unimap.Find: data InsertRes k
+ Unimap.Find: data InsertVal
+ Unimap.Find: data LookupRes k
+ Unimap.Find: data LookupVal k
+ Unimap.Find: data MergeRes k
+ Unimap.Find: data MergeVal k
+ Unimap.Find: data UnionFind k
+ Unimap.Find: empty :: UnionFind k
+ Unimap.Find: equiv :: Coercible k Int => UnionFind k -> (Equiv k, Maybe (UnionFind k))
+ Unimap.Find: equivLM :: (Coercible k Int, MonadState s m) => UnionFindLens s k -> m (Equiv k)
+ Unimap.Find: equivM :: (Coercible k Int, MonadState (UnionFind k) m) => m (Equiv k)
+ Unimap.Find: insert :: Coercible k Int => k -> UnionFind k -> InsertRes k
+ Unimap.Find: insertLM :: (Coercible k Int, MonadState s m) => UnionFindLens s k -> k -> m InsertVal
+ Unimap.Find: insertM :: (Coercible k Int, MonadState (UnionFind k) m) => k -> m InsertVal
+ Unimap.Find: instance GHC.Classes.Eq Unimap.Find.InsertVal
+ Unimap.Find: instance GHC.Classes.Eq k => GHC.Classes.Eq (Unimap.Find.InsertRes k)
+ Unimap.Find: instance GHC.Classes.Eq k => GHC.Classes.Eq (Unimap.Find.LookupRes k)
+ Unimap.Find: instance GHC.Classes.Eq k => GHC.Classes.Eq (Unimap.Find.LookupVal k)
+ Unimap.Find: instance GHC.Classes.Eq k => GHC.Classes.Eq (Unimap.Find.MergeRes k)
+ Unimap.Find: instance GHC.Classes.Eq k => GHC.Classes.Eq (Unimap.Find.MergeVal k)
+ Unimap.Find: instance GHC.Classes.Eq k => GHC.Classes.Eq (Unimap.Find.UnionFind k)
+ Unimap.Find: instance GHC.Show.Show Unimap.Find.InsertVal
+ Unimap.Find: instance GHC.Show.Show k => GHC.Show.Show (Unimap.Find.InsertRes k)
+ Unimap.Find: instance GHC.Show.Show k => GHC.Show.Show (Unimap.Find.LookupRes k)
+ Unimap.Find: instance GHC.Show.Show k => GHC.Show.Show (Unimap.Find.LookupVal k)
+ Unimap.Find: instance GHC.Show.Show k => GHC.Show.Show (Unimap.Find.MergeRes k)
+ Unimap.Find: instance GHC.Show.Show k => GHC.Show.Show (Unimap.Find.MergeVal k)
+ Unimap.Find: instance GHC.Show.Show k => GHC.Show.Show (Unimap.Find.UnionFind k)
+ Unimap.Find: lookup :: Coercible k Int => k -> UnionFind k -> LookupRes k
+ Unimap.Find: lookupLM :: (Coercible k Int, MonadState s m) => UnionFindLens s k -> k -> m (LookupVal k)
+ Unimap.Find: lookupM :: (Coercible k Int, MonadState (UnionFind k) m) => k -> m (LookupVal k)
+ Unimap.Find: member :: Coercible k Int => k -> UnionFind k -> Bool
+ Unimap.Find: mergeMany :: (Traversable f, Coercible k Int, Eq k) => k -> f k -> UnionFind k -> MergeRes k
+ Unimap.Find: mergeManyLM :: (Traversable f, Coercible k Int, Eq k, MonadState s m) => UnionFindLens s k -> k -> f k -> m (MergeVal k)
+ Unimap.Find: mergeManyM :: (Traversable f, Coercible k Int, Eq k, MonadState (UnionFind k) m) => k -> f k -> m (MergeVal k)
+ Unimap.Find: mergeOne :: (Coercible k Int, Eq k) => k -> k -> UnionFind k -> MergeRes k
+ Unimap.Find: mergeOneLM :: (Coercible k Int, Eq k, MonadState s m) => UnionFindLens s k -> k -> k -> m (MergeVal k)
+ Unimap.Find: mergeOneM :: (Coercible k Int, Eq k, MonadState (UnionFind k) m) => k -> k -> m (MergeVal k)
+ Unimap.Find: singleton :: Coercible k Int => k -> UnionFind k
+ Unimap.Find: size :: UnionFind k -> Int
Files
- src/Unimap.hs +4/−0
- src/Unimap/Find.hs +197/−0
- unimap.cabal +3/−2
src/Unimap.hs view
@@ -16,6 +16,7 @@ , UnionMap (unUnionMap) , UnionMapLens , empty+ , singleton , size , member , toList@@ -178,6 +179,9 @@ empty :: UnionMap k v empty = UnionMap ILM.empty++singleton :: (Coercible k Int) => k -> v -> UnionMap k v+singleton k v = UnionMap (ILM.singleton k (EntryValue v)) size :: UnionMap k v -> Int size = ILM.size . unUnionMap
+ src/Unimap/Find.hs view
@@ -0,0 +1,197 @@+-- | (Import this module qualified)+module Unimap.Find+ ( Changed (..)+ , Equiv (..)+ , UnionFind+ , empty+ , singleton+ , size+ , member+ , InsertRes (..)+ , InsertVal (..)+ , insert+ , insertLM+ , insertM+ , LookupRes (..)+ , LookupVal (..)+ , lookup+ , lookupLM+ , lookupM+ , equiv+ , equivLM+ , equivM+ , compact+ , compactLM+ , compactM+ , MergeRes (..)+ , MergeVal (..)+ , mergeOne+ , mergeOneLM+ , mergeOneM+ , mergeMany+ , mergeManyLM+ , mergeManyM+ )+where++import Control.Monad.State.Strict (MonadState)+import Data.Bifunctor (second)+import Data.Coerce (Coercible)+import Data.Functor ((<&>))+import Data.Void (Void)+import IntLike.Map (IntLikeMap)+import IntLike.Set (IntLikeSet)+import IntLike.Set qualified as ILS+import Optics (Iso', Lens', coerced, (%))+import Optics.Lens (equality')+import Unimap (Changed (..), Equiv, UnionMap)+import Unimap qualified as UM+import Prelude hiding (lookup)++newtype UnionFind k = UnionFind {unUnionFind :: UnionMap k (IntLikeSet k)}+ deriving stock (Eq, Show)++type UnionFindLens s k = Lens' s (UnionFind k)++ufToUmIso :: Iso' (UnionFind k) (UnionMap k (IntLikeSet k))+ufToUmIso = coerced++empty :: UnionFind k+empty = UnionFind UM.empty++singleton :: (Coercible k Int) => k -> UnionFind k+singleton k = UnionFind (UM.singleton k (ILS.singleton k))++size :: UnionFind k -> Int+size = UM.size . unUnionFind++member :: (Coercible k Int) => k -> UnionFind k -> Bool+member k = UM.member k . unUnionFind++data InsertRes k+ = InsertResAdded !(UnionFind k)+ | InsertResDuplicate+ deriving stock (Eq, Show)++insert :: (Coercible k Int) => k -> UnionFind k -> InsertRes k+insert k (UnionFind um) =+ case UM.add k (ILS.singleton k) um of+ UM.AddResAdded um' -> InsertResAdded (UnionFind um')+ UM.AddResDuplicate -> InsertResDuplicate++data InsertVal+ = InsertValInserted+ | InsertValDuplicate+ deriving stock (Eq, Show)++insertLM :: (Coercible k Int, MonadState s m) => UnionFindLens s k -> k -> m InsertVal+insertLM l k =+ UM.addLM (l % ufToUmIso) k (ILS.singleton k) <&> \case+ UM.AddValAdded -> InsertValInserted+ UM.AddValDuplicate -> InsertValDuplicate++insertM :: (Coercible k Int, MonadState (UnionFind k) m) => k -> m InsertVal+insertM = insertLM equality'++data LookupRes k+ = LookupResMissing !k+ | LookupResFound !k !(IntLikeSet k) !(Maybe (UnionFind k))+ deriving stock (Eq, Show)++lookup :: (Coercible k Int) => k -> UnionFind k -> LookupRes k+lookup k (UnionFind um) =+ case UM.lookup k um of+ UM.LookupResMissing k' -> LookupResMissing k'+ UM.LookupResFound k' x y -> LookupResFound k' x (fmap UnionFind y)++data LookupVal k+ = LookupValMissing !k+ | LookupValOk !k !(IntLikeSet k) !Changed+ deriving stock (Eq, Show)++lookupLM :: (Coercible k Int, MonadState s m) => UnionFindLens s k -> k -> m (LookupVal k)+lookupLM l k =+ UM.lookupLM (l % ufToUmIso) k <&> \case+ UM.LookupValMissing k' -> LookupValMissing k'+ UM.LookupValOk x y c -> LookupValOk x y c++lookupM :: (Coercible k Int, MonadState (UnionFind k) m) => k -> m (LookupVal k)+lookupM = lookupLM equality'++equiv :: (Coercible k Int) => UnionFind k -> (Equiv k, Maybe (UnionFind k))+equiv = second (fmap UnionFind) . UM.equiv . unUnionFind++equivLM :: (Coercible k Int, MonadState s m) => UnionFindLens s k -> m (Equiv k)+equivLM l = UM.equivLM (l % ufToUmIso)++equivM :: (Coercible k Int, MonadState (UnionFind k) m) => m (Equiv k)+equivM = equivLM equality'++compact :: (Coercible k Int) => UnionFind k -> (IntLikeMap k k, UnionFind k)+compact = second UnionFind . UM.compact . unUnionFind++compactLM :: (Coercible k Int, MonadState s m) => UnionFindLens s k -> m (IntLikeMap k k)+compactLM l = UM.compactLM (l % ufToUmIso)++compactM :: (Coercible k Int, MonadState (UnionFind k) m) => m (IntLikeMap k k)+compactM = compactLM equality'++data MergeRes k+ = MergeResMissing !k+ | MergeResMerged !k !(IntLikeSet k) !(UnionFind k)+ deriving stock (Eq, Show)++data MergeVal k+ = MergeValMissing !k+ | MergeValMerged !k !(IntLikeSet k)+ deriving stock (Eq, Show)++type MergeOne e v r = Maybe v -> v -> Either e (r, v)++type MergeMany f e v r = Maybe v -> f v -> Either e (r, v)++oneFn :: UM.MergeOne Void (IntLikeSet k) ()+oneFn = UM.foldMergeOne (\x y -> Right ((), x <> y))++manyFn :: (Foldable f) => UM.MergeMany f Void (IntLikeSet k) ()+manyFn = UM.foldMergeMany (Right mempty) (\x y -> Right ((), x <> y))++mergeOne :: (Coercible k Int, Eq k) => k -> k -> UnionFind k -> MergeRes k+mergeOne k j (UnionFind um) =+ case UM.mergeOne oneFn k j um of+ UM.MergeResMissing k' -> MergeResMissing k'+ UM.MergeResMerged k' x _ y -> MergeResMerged k' x (UnionFind y)++mergeOneLM+ :: (Coercible k Int, Eq k, MonadState s m) => UnionFindLens s k -> k -> k -> m (MergeVal k)+mergeOneLM l k j =+ UM.mergeOneLM (l % ufToUmIso) oneFn k j <&> \case+ UM.MergeValMissing k' -> MergeValMissing k'+ UM.MergeValMerged k' x _ -> MergeValMerged k' x++mergeOneM :: (Coercible k Int, Eq k, MonadState (UnionFind k) m) => k -> k -> m (MergeVal k)+mergeOneM = mergeOneLM equality'++mergeMany :: (Traversable f, Coercible k Int, Eq k) => k -> f k -> UnionFind k -> MergeRes k+mergeMany k js (UnionFind um) =+ case UM.mergeMany manyFn k js um of+ UM.MergeResMissing k' -> MergeResMissing k'+ UM.MergeResMerged k' x _ y -> MergeResMerged k' x (UnionFind y)++mergeManyLM+ :: (Traversable f, Coercible k Int, Eq k, MonadState s m)+ => UnionFindLens s k+ -> k+ -> f k+ -> m (MergeVal k)+mergeManyLM l k js =+ UM.mergeManyLM (l % ufToUmIso) manyFn k js <&> \case+ UM.MergeValMissing k' -> MergeValMissing k'+ UM.MergeValMerged k' x _ -> MergeValMerged k' x++mergeManyM+ :: (Traversable f, Coercible k Int, Eq k, MonadState (UnionFind k) m)+ => k+ -> f k+ -> m (MergeVal k)+mergeManyM = mergeManyLM equality'
unimap.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: unimap-version: 0.1.0+version: 0.1.1 synopsis: A union-find/map data structure description: Please see the README on GitHub at <https://github.com/ejconlon/unimap#readme> homepage: https://github.com/ejconlon/unimap#readme@@ -25,6 +25,7 @@ library exposed-modules: Unimap+ Unimap.Find other-modules: Paths_unimap hs-source-dirs:@@ -108,6 +109,6 @@ , int-like >=0.1.4 && <0.2 , mtl ==2.3.* , optics ==0.4.*- , prop-unit >=0.1.4 && <0.2+ , prop-unit >=1.0.1 && <1.1 , unimap default-language: GHC2021