import {Map, on, Predicate, to} from 'tsfun';
import {SortUtil} from './sort-util';
import {makeLookup, mapToArray} from './transformers';
import {sortStructArray} from './sort-struct-array';
/**
* @author Daniel de Oliveira
*/
type Name = string;
type Label = string;
export interface Named { name: Name }
export interface Labelled { label?: Label }
export module Named {
export const NAME = 'name';
}
export module Labelled {
export const LABEL = 'label';
}
/**
* as: [{ name: '17', e: 9 }, { name: '19', e: 7 }]
* ->
* { '17': { e: 9, name: '17' }, { '19': { e: 7, name: '19' }}}
*/
export function namedArrayToNamedMap(as: Array): Map {
return makeLookup(Named.NAME)(as);
}
export function mapToNamedArray(m: Map) {
return mapToArray(Named.NAME)(m) as Array;
}
export function sortNamedArray(order: string[]) {
return (items: Array): Array => {
return sortStructArray(order, Named.NAME)(items);
}
}
export function byName(a: Named, b: Named) { // to be used with sort
return SortUtil.alnumCompare(a.name, b.name);
}
export const onName = (p: Predicate) => on([Named.NAME], p);
export const toName = to([Named.NAME]);