packages feed

WeakSets 1.1.2.0 → 1.1.3.0

raw patch · 4 files changed

+20/−3 lines, 4 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

+ Data.WeakMap: inverse :: (Eq k, Eq v) => Map k v -> Maybe (Map v k)
+ Data.WeakMap: pseudoInverse :: Map k v -> Map v k
+ Data.WeakMap.Safe: inverse :: (Eq k, Eq v) => Map k v -> Maybe (Map v k)
+ Data.WeakMap.Safe: pseudoInverse :: Map k v -> Map v k

Files

CHANGELOG.md view
@@ -18,4 +18,8 @@ 
 # 1.1.2.0 -- 2022-07-19
 
-* Addition of weakMapFromSet and correction of WeakMap Show instance.+* Addition of weakMapFromSet and correction of WeakMap Show instance.
+
+# 1.1.3.0 -- 2022-07-20
+
+* Addition of inverse and pseudoInverse functions.
WeakSets.cabal view
@@ -14,7 +14,7 @@ -- PVP summary:      +-+------- breaking API changes
 --                   | | +----- non-breaking API additions
 --                   | | | +--- code changes with no API change
-version:            1.1.2.0
+version:            1.1.3.0
 
 -- A short (one-line) description of the package.
 synopsis:
src/Data/WeakMap.hs view
@@ -207,6 +207,8 @@     -- * Others
     , idFromSet
     , memorizeFunction
+    , inverse
+    , pseudoInverse
 ) where
 import           Prelude  hiding      (lookup, map, filter, drop, take, splitAt)
 import           Data.WeakSet         (Set)
@@ -253,6 +255,7 @@ weakMap :: AssociationList k v -> Map k v
 weakMap al = Map $ set $ al
 
+-- | /O(1)/. Construct a 'Map' from a 'Set' of pairs (key,value).
 weakMapFromSet :: Set (k,v) -> Map k v
 weakMapFromSet s = Map s
 
@@ -907,5 +910,13 @@ memorizeFunction :: (k -> v) -> Set k -> Map k v
 memorizeFunction f xs = Map $ (\k -> (k, f k)) <$> xs
 
-
+-- | /O(n^2)/. Try to construct an inverse map.
+inverse :: (Eq k, Eq v) => Map k v -> Maybe (Map v k)
+inverse m@(Map al)
+    | (cardinal.image $ m) == (cardinal.domain $ m) = Just $ Map $ (\(k,v) -> (v,k)) <$> al
+    | otherwise = Nothing
+    
+-- | /O(n)/. Return a pseudo inverse /g/ of a 'Map' /f/ such that @f |.| g |.| f == f@.
+pseudoInverse :: Map k v -> Map v k
+pseudoInverse (Map al) = Map $ (\(k,v) -> (v,k)) <$> al
 
src/Data/WeakMap/Safe.hs view
@@ -22,6 +22,8 @@     , keys'
     , domain
     , image
+    , inverse
+    , pseudoInverse
 )
 where
     import              Data.WeakMap