rubico
Version:
[a]synchronous functional programming
51 lines (50 loc) • 1.4 kB
TypeScript
export = groupBy;
/**
* @name groupBy
*
* @synopsis
* ```coffeescript [specscript]
* Reducer<T> = (any, T)=>Promise|any
* Foldable<T> = Iterable<T>|AsyncIterable<T>|{ reduce: Reducer<T>=>any }|Object<T>
*
* var property any,
* resolver any=>Promise|any,
* value Foldable
*
* groupBy(property)(value) -> groupedByProperty Map<any=>Array>
*
* groupBy(resolver)(value) -> groupedByResolver Promise|Map<any=>Array>
* ```
*
* @description
* Group a foldable collection into a Map of arrays by a property on each of its elements.
*
* ```javascript [playground]
* import groupBy from 'https://unpkg.com/rubico/dist/x/groupBy.es.js'
*
* console.log(
* groupBy('age')([
* { name: 'George', age: 22 },
* { name: 'Jane', age: 22 },
* { name: 'Henry', age: 23 },
* ]),
* )
* // Map {
* // 22 => [{ name: 'George', age: 22 }, { name: 'Jane', age: 22 }],
* // 23 => [{ name: 'Henry', age: 23 }],
* // }
* ```
*
* Additionally, pass a resolver in property position to resolve a value for group membership for each item.
*
* ```javascript [playground]
* import groupBy from 'https://unpkg.com/rubico/dist/x/groupBy.es.js'
*
* console.log(
* groupBy(
* word => word.toLowerCase(),
* )(['Hello', 'hello', 'Hey']),
* ) // Map { 'hello' => ['Hello', 'hello'], 'hey' => ['Hey'] }
* ```
*/
declare function groupBy(propertyOrResolver: any): any;