Index function
Opened this issue · 3 comments
A nice helper function to add to the library might be:
uniqueIndex :: forall f a b. (Foldable f, Functor f, Ord b) => (a -> b) -> f a -> Map b a
uniqueIndex toKey = M.fromFoldable <<< map (\x -> Tuple (toKey x) x)
I got the idea from the equivalent method from Guava in Java land.
This is obviously a method that we could all re-write ourselves but it seems like a common enough pattern (and one that is easy enough to support) that it might be worth making it into the library.
An equivalent method can be written for StrMap; just replace all references to 'b' with 'String' and 'Map' with 'StrMap'.
Maybe this should be called something like fromFoldableWithKey?
Also, does it really need Functor? (Yes if it's implemented this way, but maybe not if we can fuse the fromFoldable with the map somehow)
I don't know if it strictly needs Functor but I was not able to come up with a method that did not require it. Maybe somebody with some more skills than I can work out how to implement this without the Functor requirement; I just went for the simplest possible thing that would work.
And 'fromFoldableWithKey sounds great to me.
I think it's just
foldl (\acc val -> insert (toKey val) val acc) memptyOr
foldMap (\a -> singleton (toKey a) a)