| 1 | -- Element-wise operations from Data.Map re-defined using Locations. |
|---|
| 2 | |
|---|
| 3 | module MapOps where |
|---|
| 4 | |
|---|
| 5 | import Data.Map (Map, empty, null, |
|---|
| 6 | Location, key, before, after, assign, clear, |
|---|
| 7 | search, index, minLocation, maxLocation) |
|---|
| 8 | |
|---|
| 9 | import Prelude hiding (null) |
|---|
| 10 | |
|---|
| 11 | -- ** Insertion |
|---|
| 12 | |
|---|
| 13 | insert :: Ord k => k -> a -> Map k a -> Map k a |
|---|
| 14 | insert k v m = assign v (snd (search k m)) |
|---|
| 15 | |
|---|
| 16 | insertWith :: Ord k => (a -> a -> a) -> k -> a -> Map k a -> Map k a |
|---|
| 17 | insertWith f k v m = case search k m of |
|---|
| 18 | (Nothing, loc) -> assign v loc |
|---|
| 19 | (Just oldv, loc) -> assign (f v oldv) loc |
|---|
| 20 | |
|---|
| 21 | insertWith' :: Ord k => (a -> a -> a) -> k -> a -> Map k a -> Map k a |
|---|
| 22 | insertWith' f k v m = case search k m of |
|---|
| 23 | (Nothing, loc) -> assign v loc |
|---|
| 24 | (Just oldv, loc) -> flip assign loc $! f v oldv |
|---|
| 25 | |
|---|
| 26 | insertWithKey :: Ord k => (k -> a -> a -> a) -> k -> a -> Map k a -> Map k a |
|---|
| 27 | insertWithKey f k v m = case search k m of |
|---|
| 28 | (Nothing, loc) -> assign v loc |
|---|
| 29 | (Just oldv, loc) -> assign (f (key loc) v oldv) loc |
|---|
| 30 | |
|---|
| 31 | insertWithKey' :: Ord k => (k -> a -> a -> a) -> k -> a -> Map k a -> Map k a |
|---|
| 32 | insertWithKey' f k v m = case search k m of |
|---|
| 33 | (Nothing, loc) -> assign v loc |
|---|
| 34 | (Just oldv, loc) -> flip assign loc $! f (key loc) v oldv |
|---|
| 35 | |
|---|
| 36 | insertLookupWithKey :: Ord k => (k -> a -> a -> a) -> k -> a -> Map k a -> (Maybe a, Map k a) |
|---|
| 37 | insertLookupWithKey f k v m = case search k m of |
|---|
| 38 | (Nothing, loc) -> (Nothing, assign v loc) |
|---|
| 39 | (Just oldv, loc) -> (Just oldv, assign (f (key loc) v oldv) loc) |
|---|
| 40 | |
|---|
| 41 | insertLookupWithKey' :: Ord k => (k -> a -> a -> a) -> k -> a -> Map k a -> (Maybe a, Map k a) |
|---|
| 42 | insertLookupWithKey' f k v m = case search k m of |
|---|
| 43 | (Nothing, loc) -> (Nothing, assign v loc) |
|---|
| 44 | (Just oldv, loc) -> v' `seq` (Just oldv, assign v' loc) |
|---|
| 45 | where v' = f (key loc) v oldv |
|---|
| 46 | |
|---|
| 47 | -- ** Delete/Update |
|---|
| 48 | |
|---|
| 49 | delete :: Ord k => k -> Map k a -> Map k a |
|---|
| 50 | delete k m = clear (snd (search k m)) |
|---|
| 51 | |
|---|
| 52 | adjust :: Ord k => (a -> a) -> k -> Map k a -> Map k a |
|---|
| 53 | adjust f k m = case search k m of |
|---|
| 54 | (Nothing, _) -> m |
|---|
| 55 | (Just v, loc) -> assign (f v) loc |
|---|
| 56 | |
|---|
| 57 | adjustWithKey :: Ord k => (k -> a -> a) -> k -> Map k a -> Map k a |
|---|
| 58 | adjustWithKey f k m = case search k m of |
|---|
| 59 | (Nothing, _) -> m |
|---|
| 60 | (Just v, loc) -> assign (f (key loc) v) loc |
|---|
| 61 | |
|---|
| 62 | update :: Ord k => (a -> Maybe a) -> k -> Map k a -> Map k a |
|---|
| 63 | update f k m = case search k m of |
|---|
| 64 | (Nothing, _) -> m |
|---|
| 65 | (Just v, loc) -> maybeAssign (f v) loc |
|---|
| 66 | |
|---|
| 67 | updateWithKey :: Ord k => (k -> a -> Maybe a) -> k -> Map k a -> Map k a |
|---|
| 68 | updateWithKey f k m = case search k m of |
|---|
| 69 | (Nothing, _) -> m |
|---|
| 70 | (Just v, loc) -> maybeAssign (f (key loc) v) loc |
|---|
| 71 | |
|---|
| 72 | updateLookupWithKey :: Ord k => (k -> a -> Maybe a) -> k -> Map k a -> (Maybe a, Map k a) |
|---|
| 73 | updateLookupWithKey f k m = case search k m of |
|---|
| 74 | (Nothing, _) -> (Nothing, m) |
|---|
| 75 | (Just v, loc) -> (Just v, maybeAssign (f (key loc) v) loc) |
|---|
| 76 | |
|---|
| 77 | alter :: Ord k => (Maybe a -> Maybe a) -> k -> Map k a -> Map k a |
|---|
| 78 | alter f k m = case search k m of |
|---|
| 79 | (v, loc) -> maybeAssign (f v) loc |
|---|
| 80 | |
|---|
| 81 | -- * Filter |
|---|
| 82 | |
|---|
| 83 | split :: Ord k => k -> Map k a -> (Map k a, Map k a) |
|---|
| 84 | split k m = case search k m of |
|---|
| 85 | (_, loc) -> (before loc, after loc) |
|---|
| 86 | |
|---|
| 87 | splitLookup :: Ord k => k -> Map k a -> (Map k a, Maybe a, Map k a) |
|---|
| 88 | splitLookup k m = case search k m of |
|---|
| 89 | (res, loc) -> (before loc, res, after loc) |
|---|
| 90 | |
|---|
| 91 | -- * Indexed |
|---|
| 92 | |
|---|
| 93 | updateAt :: (k -> a -> Maybe a) -> Int -> Map k a -> Map k a |
|---|
| 94 | updateAt f i m = case index i m of |
|---|
| 95 | (v, loc) -> maybeAssign (f (key loc) v) loc |
|---|
| 96 | |
|---|
| 97 | deleteAt :: Int -> Map k a -> Map k a |
|---|
| 98 | deleteAt i m = clear (snd (index i m)) |
|---|
| 99 | |
|---|
| 100 | -- * Min/Max |
|---|
| 101 | |
|---|
| 102 | deleteMin :: Map k a -> Map k a |
|---|
| 103 | deleteMin m |
|---|
| 104 | | null m = empty |
|---|
| 105 | | otherwise = clear (snd (minLocation m)) |
|---|
| 106 | |
|---|
| 107 | deleteMax :: Map k a -> Map k a |
|---|
| 108 | deleteMax m |
|---|
| 109 | | null m = empty |
|---|
| 110 | | otherwise = clear (snd (maxLocation m)) |
|---|
| 111 | |
|---|
| 112 | deleteFindMin :: Map k a -> ((k, a), Map k a) |
|---|
| 113 | deleteFindMin m |
|---|
| 114 | | null m = (error "Map.deleteFindMin: empty map", m) |
|---|
| 115 | | otherwise = case minLocation m of |
|---|
| 116 | (x, loc) -> ((key loc, x), clear loc) |
|---|
| 117 | |
|---|
| 118 | deleteFindMax :: Map k a -> ((k, a), Map k a) |
|---|
| 119 | deleteFindMax m |
|---|
| 120 | | null m = (error "Map.deleteFindMax: empty map", m) |
|---|
| 121 | | otherwise = case maxLocation m of |
|---|
| 122 | (x, loc) -> ((key loc, x), clear loc) |
|---|
| 123 | |
|---|
| 124 | updateMin :: (a -> Maybe a) -> Map k a -> Map k a |
|---|
| 125 | updateMin f m |
|---|
| 126 | | null m = m |
|---|
| 127 | | otherwise = case minLocation m of |
|---|
| 128 | (x, loc) -> maybeAssign (f x) loc |
|---|
| 129 | |
|---|
| 130 | updateMax :: (a -> Maybe a) -> Map k a -> Map k a |
|---|
| 131 | updateMax f m |
|---|
| 132 | | null m = m |
|---|
| 133 | | otherwise = case maxLocation m of |
|---|
| 134 | (x, loc) -> maybeAssign (f x) loc |
|---|
| 135 | |
|---|
| 136 | updateMinWithKey :: (k -> a -> Maybe a) -> Map k a -> Map k a |
|---|
| 137 | updateMinWithKey f m |
|---|
| 138 | | null m = m |
|---|
| 139 | | otherwise = case minLocation m of |
|---|
| 140 | (x, loc) -> maybeAssign (f (key loc) x) loc |
|---|
| 141 | |
|---|
| 142 | updateMaxWithKey :: (k -> a -> Maybe a) -> Map k a -> Map k a |
|---|
| 143 | updateMaxWithKey f m |
|---|
| 144 | | null m = m |
|---|
| 145 | | otherwise = case maxLocation m of |
|---|
| 146 | (x, loc) -> maybeAssign (f (key loc) x) loc |
|---|
| 147 | |
|---|
| 148 | minView :: Map k a -> Maybe (a, Map k a) |
|---|
| 149 | minView m |
|---|
| 150 | | null m = Nothing |
|---|
| 151 | | otherwise = case minLocation m of |
|---|
| 152 | (x, loc) -> Just (x, clear loc) |
|---|
| 153 | |
|---|
| 154 | maxView :: Map k a -> Maybe (a, Map k a) |
|---|
| 155 | maxView m |
|---|
| 156 | | null m = Nothing |
|---|
| 157 | | otherwise = case maxLocation m of |
|---|
| 158 | (x, loc) -> Just (x, clear loc) |
|---|
| 159 | |
|---|
| 160 | minViewWithKey :: Map k a -> Maybe ((k, a), Map k a) |
|---|
| 161 | minViewWithKey m |
|---|
| 162 | | null m = Nothing |
|---|
| 163 | | otherwise = case minLocation m of |
|---|
| 164 | (x, loc) -> Just ((key loc, x), clear loc) |
|---|
| 165 | |
|---|
| 166 | maxViewWithKey :: Map k a -> Maybe ((k, a), Map k a) |
|---|
| 167 | maxViewWithKey m |
|---|
| 168 | | null m = Nothing |
|---|
| 169 | | otherwise = case maxLocation m of |
|---|
| 170 | (x, loc) -> Just ((key loc, x), clear loc) |
|---|
| 171 | |
|---|
| 172 | -- utility |
|---|
| 173 | |
|---|
| 174 | maybeAssign :: Maybe a -> Location k a -> Map k a |
|---|
| 175 | maybeAssign = maybe clear assign |
|---|