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