Adding a "Map k a -> Set (Arg k a)" function to containers

David Feuer david.feuer at
Fri Jan 28 01:34:15 UTC 2022

I have one minor operational concern. Set is strict in its keys, so code
doesn't have to check whether a key is evaluated when case matching on it.
Arg, on the other hand, is lazy in both arguments. So this function throws
away evaluatedness information, which is always a bit sad.

Separately, I'd love see:

1. A function going the other way.
2. Unsafe mapMonotonic-style functions generalizing both.

On Thu, Jan 27, 2022, 8:25 PM Joseph C. Sible <josephcsible at>

> I opened about adding
> this function to the containers package:
> import qualified Data.Map.Internal as Map
> import qualified Data.Set.Internal as Set
> import Data.Semigroup (Arg(..))
> mapToArgSet :: Map.Map k a -> Set.Set (Arg k a)
> mapToArgSet Map.Tip = Set.Tip
> mapToArgSet (Map.Bin sz k v l r) = Set.Bin sz (Arg k v) (mapToArgSet
> l) (mapToArgSet r)
> Does anyone have any suggestions or improvements for this? In
> particular, I'm sure there's a less clunky name that I just can't
> think of.
> Thanks,
> Joseph C. Sible
> _______________________________________________
> Libraries mailing list
> Libraries at
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the Libraries mailing list