Copyright | (c) Uli Köhler 2014 |
---|---|
License | Apache License v2.0 |
Maintainer | ukoehler@techoverflow.net |
Stability | provisional |
Portability | portable |
Safe Haskell | Safe |
Language | Haskell2010 |
A collection of grouping utility functions. For a given function that assigns a key to objects, provides functions that group said objects into a multimap by said key.
This can be used similarly to the SQL GROUP BY statement.
Provides a more flexible approach to GHC.Exts.groupWith
groupWith (take 1) ["a","ab","bc"] == Map.fromList [("a",["a","ab"]), ("b",["bc"])]
In order to use monadic / applicative functions as key generators,
use the A- or M-postfixed variants like groupWithA
or groupWithMultipleM
- type MultiMap a b = Map a [b]
- groupWith :: Ord b => (a -> b) -> [a] -> MultiMap b a
- groupWithMultiple :: Ord b => (a -> [b]) -> [a] -> MultiMap b a
- groupWithUsing :: Ord b => (a -> c) -> (c -> c -> c) -> (a -> b) -> [a] -> Map b c
- groupWithA :: (Ord b, Applicative f) => (a -> f b) -> [a] -> f (MultiMap b a)
- groupWithM :: (Ord b, Monad m, Applicative m) => (a -> m b) -> [a] -> m (MultiMap b a)
- groupWithMultipleM :: (Ord b, Monad m, Applicative m) => (a -> m [b]) -> [a] -> m (MultiMap b a)
- groupWithUsingM :: (Ord b, Monad m, Applicative m) => (a -> m c) -> (c -> c -> c) -> (a -> m b) -> [a] -> m (Map b c)
Documentation
:: Ord b | |
=> (a -> b) | The function used to map a list value to its key |
-> [a] | The list to be grouped |
-> MultiMap b a | The resulting key --> value multimap |
Group values in a list by a key, generated by a given function. The resulting map contains for each generated key the values (from the given list) that yielded said key by applying the function on said value.
:: Ord b | |
=> (a -> [b]) | The function used to map a list value to its keys |
-> [a] | The list to be grouped |
-> MultiMap b a | The resulting map |
Like groupWith
, but the identifier-generating function
may generate multiple keys for each value (or none at all).
The corresponding value from the original list will be placed
in the identifier-corresponding map entry for each generated
identifier.
Note that values are added to the
:: Ord b | |
=> (a -> c) | Transformer function used to map a value to the resulting type |
-> (c -> c -> c) | The combinator used to combine an existing value for a given key with a new value |
-> (a -> b) | The function used to map a list value to its key |
-> [a] | The list to be grouped |
-> Map b c | The resulting key --> transformed value map |
Like groupWith, but uses a custom combinator function
:: (Ord b, Applicative f) | |
=> (a -> f b) | The function used to map a list value to its key |
-> [a] | The list to be grouped |
-> f (MultiMap b a) | The resulting key --> value multimap |
:: (Ord b, Monad m, Applicative m) | |
=> (a -> m b) | The function used to map a list value to its key |
-> [a] | The list to be grouped |
-> m (MultiMap b a) | The resulting key --> value multimap |
Alias for groupWithA
, with additional monad constraint
:: (Ord b, Monad m, Applicative m) | |
=> (a -> m [b]) | The function used to map a list value to its keys |
-> [a] | The list to be grouped |
-> m (MultiMap b a) | The resulting map |
Like groupWithM
, but the identifier-generating function
may generate multiple keys for each value (or none at all).
See groupWithMultiple
for further behavioural details.
Note that it's impossible to define this for applicatives: See http://stackoverflow.com/a/6032260/2597135
:: (Ord b, Monad m, Applicative m) | |
=> (a -> m c) | Transformer function used to map a value to the resulting type |
-> (c -> c -> c) | The combinator used to combine an existing value for a given key with a new value |
-> (a -> m b) | The function used to map a list value to its key |
-> [a] | The list to be grouped |
-> m (Map b c) | The resulting key --> transformed value map |
Like groupWithM
, but uses a custom combinator function