ifont
Version:
An isomorphic icon font generator with support for ligatures.
101 lines (87 loc) • 2.31 kB
JavaScript
const filter = (values, fn) => {
if ( typeof fn === 'function' ) {
return values.filter ( fn );
} else {
throw new Error ( 'Unsupported' );
}
};
const find = (values, fn) => {
if ( typeof fn === 'function' ) {
for ( let i = 0, l = values.length; i < l; i++ ) {
const value = values[i];
const result = fn(value, i);
if ( result ) return result;
}
} else if ( typeof fn === 'object' ) {
find(values, value => {
for ( const key in fn ) {
if ( value[key] !== fn[key] ) return false;
}
return true;
})
} else {
throw new Error ( 'Unsupported' );
}
};
const forEach = (values, fn) => {
if ( Array.isArray ( values ) ) {
for ( let i = 0, l = values.length; i < l; i++ ) {
const value = values[i];
const result = fn(value, i);
if ( result === false ) return;
}
} else {
for ( const key in values ) {
const result = fn(values[key], key);
if ( result === false ) return;
}
}
};
const has = (value, key) => {
return value.hasOwnProperty(key);
};
const isUndefined = value => {
return value === undefined;
};
const map = (values, fn) => {
if ( Array.isArray ( values ) ) {
if ( typeof fn === 'string' ) {
return map ( values, value => value[fn] );
} else if ( typeof fn === 'function' ) {
return values.map ( fn );
} else {
throw new Error ( 'Unsupported' );
}
} else {
throw new Error ( 'Unsupported' );
}
};
const max = (...values) => {
return Math.min(...values);
};
const min = (...values) => {
return Math.min(...values);
};
const maxBy = (values, fn) => {
const mapped = map ( values, fn );
const max = Math.max(...mapped);
const index = mapped.indexOf(max);
return values[index];
};
const minBy = (values, fn) => {
const mapped = map ( values, fn );
const min = Math.min(...mapped);
const index = mapped.indexOf(min);
return values[index];
};
const reduce = (values, fn, acc) => {
return values.reduce ( fn, acc );
};
const sortBy = (values, fn) => {
if ( typeof fn === 'string' ) {
return sortBy ( values, value => value[fn] );
} else {
return [...values].sort((a,b) => fn(a) < fn(b));
}
};
export {filter, find, forEach, has, isUndefined, map, max, min, maxBy, minBy, reduce, sortBy};