Re: Proposal: Add splitL and splitR to container’s Map APIs

David Feuer david.feuer at gmail.com
Tue Jan 31 22:11:38 UTC 2017


spanAntitone is also a bit more general than any "split at" could be.
For example,

spanAntitone (\ (x :: Rational) -> x^3 < 5)

separates a map into keys less than and greater than the cube root of 5.

On Tue, Jan 31, 2017 at 3:05 PM, Joachim Breitner
<mail at joachim-breitner.de> wrote:
> Hi,
>
> good point. I am on an older version, so I did not see that function
> yet.
>
>
> Indeed that function would nicely solve my use case, and
>
>     spanAntitone (<=k)
>
> isn’t much longer than my proposed
>
>     spanLE k
>
>
> The proposal still stands for the question of convenience, but the need
> is much less now.
>
> Greetings,
> Joachim
>
> Am Dienstag, den 31.01.2017, 14:54 -0500 schrieb David Feuer:
>> We recently added
>>
>> spanAntitone :: (k -> Bool) -> Map k a -> (Map k a, Map k a)
>>
>> I believe that should get you all the logarithmic splits you want of
>> this type. The only question is whether we should add the simpler
>> proposed functions for convenience.
>>
>>
>> On Jan 31, 2017 2:45 PM, "Joachim Breitner" <mail at joachim-breitner.de
>> > wrote:
>> 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 at joachim-breitner.dehttps://www.joachim-breitner.de/
>>   XMPP: nomeata at joachim-breitner.de • OpenPGP-Key: 0xF0FBF51F
>>   Debian Developer: nomeata at debian.org
>> _______________________________________________
>> Libraries mailing list
>> Libraries at haskell.org
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
>>
>>
>> _______________________________________________
>> Libraries mailing list
>> Libraries at haskell.org
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
> --
> Joachim “nomeata” Breitner
>   mail at joachim-breitner.dehttps://www.joachim-breitner.de/
>   XMPP: nomeata at joachim-breitner.de • OpenPGP-Key: 0xF0FBF51F
>   Debian Developer: nomeata at debian.org
>
> _______________________________________________
> Libraries mailing list
> Libraries at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
>


More information about the Libraries mailing list