[Haskell-cafe] Data.Map: Enumerating ordered subset of keys
Jared Updike
jupdike at gmail.com
Mon Feb 9 11:33:49 EST 2009
On 2/8/09, Evan Laforge <qdunkan at gmail.com> wrote:
> I have a little util library with various map functions. 'within' is
> almost what you want, except it's half-open. You can make an
> inclusive one by pulling the lowest element off the above map.
>
> I'm also curious if there's a better way to do this...
>
> -- | Like Map.split, except include a matched key in the above map.
> split_map :: (Ord k) => k -> Map.Map k a -> (Map.Map k a, Map.Map k a)
> split_map k fm = (pre, post')
> where
> (pre, at, post) = Map.splitLookup k fm
> post' = maybe post (\v -> Map.insert k v post) at
>
> -- | Split the map into the maps below, within, and above the given range.
> -- @low@ to @high@ is half-open, as usual.
> split3_map :: (Ord k) => k -> k -> Map.Map k a
> -> (Map.Map k a, Map.Map k a, Map.Map k a)
> split3_map low high fm = (below, within, way_above)
> where
> (below, above) = split_map low fm
> (within, way_above) = split_map high above
>
> within low high fm = let (_, m, _) = split3_map low high fm in m
This looks right to me (correct time complexity). It should do what I
need. I will test it and see what I discover.
Thanks,
Jared.
More information about the Haskell-Cafe
mailing list