
Hi, I regularly find myself in the need of splitting a map into two maps. For that we currently have these two functions: split :: Ord k => k -> Map k a -> (Map k a, Map k a) splitLookup :: Ord k => k -> Map k a -> (Map k a, Maybe a, Map k a) Usually, split is useless to me because information (the element right on the border) gets lost. splitLookup preserves the information, but often I want the element at the border to simply be in one of the two output maps. So I would like to see splitL :: Ord k => k -> Map k a -> (Map k a, Map k a) splitR :: Ord k => k -> Map k a -> (Map k a, Map k a) with these properties uncurry union (splitL k m) == m uncurry union (splitR k m) == m all (<= k) (keys (fst (splitL k m)) all (> k) (keys (snd (splitL k m)) all (< k) (keys (fst (splitR k m)) all (>= k) (keys (snd (splitR k m)) These new functions should be added to Data.Map, Data.IntMap (in both variatans each) and, for consistency, Data.Set. Alternative names (in correspondence with Data.Set.lookup{LT,LE,GT,TE}) would be splitLE (instead of splitL) and splitLT (instead of splitR). Corresponding issue: https://github.com/haskell/containers/issues/387 Discussion period: 2 weeks (until Feb 14). Greetings, Joachim -- Joachim “nomeata” Breitner mail@joachim-breitner.de • https://www.joachim-breitner.de/ XMPP: nomeata@joachim-breitner.de • OpenPGP-Key: 0xF0FBF51F Debian Developer: nomeata@debian.org