UNPKG

react-native-sparkline

Version:

An ART-based sparkline component for react-native

84 lines (73 loc) 1.5 kB
/** * @flow */ /** * Max * * @param {Array.<number>} xs * @return {number} */ export function max (xs: number[]): number { return Math.max.apply(undefined, xs) } /** * Min * * @param {Array.<number>} xs * @return {number} */ export function min (xs: number[]): number { return Math.min.apply(undefined, xs) } const nonEmpty = (xs: number[]) => xs && xs.length > 0 /** * Average * * @param {Array.<number>} xs * @return {number} */ export function mean (xs: number[]): number { return nonEmpty(xs) ? xs.reduce((a, b) => a + b) / xs.length : 0 } /** * Median * * @param {Array.<number>} xs * @return {number} */ export function median (xs: number[]): number { return nonEmpty(xs) ? xs.sort()[Math.floor(xs.length / 2)] : 0 } const devSum = xs => { const avg = mean(xs) return xs.reduce((acc, x) => { return acc + Math.pow(x - avg, 2) }) } /** * Standard Deviation * * @param {Array.<number>} xs * @return {number} */ export function stdev (xs: number[]): number { return nonEmpty(xs) ? Math.sqrt(devSum(xs) / (xs.length - 1)) : 0 } /** * Sample Data * * @param {Array.<number>} xs * @param {number} sampling * @return {number} */ export function sample<T> (xs: T[], sampling: number): T[] { const band = (sampling > 1 ? xs.length : 1) / sampling const step = Math.round(Math.min(band, xs.length / 2)) let cursor = -1 return xs.filter((x, i) => { if (i > cursor) { cursor += step } return i === cursor }) }