
On 3/31/07, Adrian Hey
Adrian Hey wrote:
Hello Folks,
Jean-Philippe suggests I put this question to the libraries list. Any thoughts?
Well thinking about this a bit more I propose that both updateLookupWithKey and insertLookupWithKey (and possibly several other functions) should be deprecated and replaced with a more general mechanism that allows users to "roll their own" as far as these complex hybrid operations are concerned
All of the functions that modify a single value in a single map can be implemented with alterA :: Applicative f => (Maybe v -> f (Maybe v)) -> k -> Map k v -> f (Map k v) In particular, -- I assume you want the old value out of updateLookup. updateLookupWithKey doUpdate key = Arrow.first getLast . alterA doChange key where doChange Nothing = (Last Nothing, Nothing) doChange (Just oldValue) = (Last (Just oldValue), doUpdate key oldValue) and insertLookupWithKey combine key value = Arrow.first getLast . alterA doChange key where doChange Nothing = (Last Nothing, Just value) doChange (Just oldValue) = (Last (Just oldValue), Just (combine key value oldValue)) I have a start on this at http://jeffrey.yasskin.info/darcs/hscollection/Data/FiniteMap.hs (written before I discovered http://darcs.haskell.org/packages/collections/, so now I'll have to merge them and send a patch). I haven't implemented alterA on Data.Map yet; it looks awkward but straightforward. If you don't intend to modify the map, lookup is probably enough, although with a slightly more general type for alterA involving "data Modification v = Delete | LeaveAlone | Replace v", we could subsume that too... -- Namasté, Jeffrey Yasskin