keepFirstWhile
keepFirstWhile
(predicate: Predicate) => (anArray: array) => array
Keep the first elements of an array that pass a condition
const lt3 = n => n < 3 const keepWhileLt3 = keepFirstWhile(lt3) keepWhileLt3([1, 2, 3]) // is [1, 2] keepWhileLt3([3, 1, 2]) // is []
const lt3 = (n: number) => n < 3 const keepWhileLt3 = keepFirstWhile(lt3) keepWhileLt3([1, 2, 3]) // is [1, 2] keepWhileLt3([3, 1, 2]) // is []
const lt3 = n => n < 3 const keepWhileLt3 = keepFirstWhile(lt3) keepWhileLt3([1, 2, 3]) // is [1, 2] keepWhileLt3([3, 1, 2]) // is []
const lt3 = (n: number) => n < 3 const keepWhileLt3 = keepFirstWhile(lt3) keepWhileLt3([1, 2, 3]) // is [1, 2] keepWhileLt3([3, 1, 2]) // is []
Sometimes we have ordered data and only care about the first elements. Below, we have an ordered list of 100-meter times. People who ran it in under 13 minutes qualify for the next round. Let's list the qualified runners.
const isSub13m = ({ time }) => time < 13 const keepSub13Times = keepFirstWhile(isSub13m) const oneHundredMeterTimes = [ { name: 'emma', time: 11.2 }, { name: 'luke', time: 12.8 }, { name: 'meg', time: 13.5 }, ] const getQualifiedRunners = compose([keepSub13Times, mapValues(get('name'))]) const qualifiedRunners = getQualifiedRunners(oneHundredMeterTimes) console.log(qualifiedRunners) // is [ // emma // luke // ]
type Runner = { name: string time: number } const isSub13m = ({ time }: Runner) => time < 13 const keepSub13Times = keepFirstWhile(isSub13m) const oneHundredMeterTimes: Runner[] = [ { name: 'emma', time: 11.2 }, { name: 'luke', time: 12.8 }, { name: 'meg', time: 13.5 }, ] const getName = get('name')<Runner> const getQualifiedRunners = compose([ keepSub13Times, mapValues(getName)<Runner[]>, ]) const qualifiedRunners = getQualifiedRunners(oneHundredMeterTimes) console.log(qualifiedRunners) // is [ // emma // luke // ]
const isSub13m = ({ time }) => time < 13 const keepSub13Times = keepFirstWhile(isSub13m) const oneHundredMeterTimes = [ { name: 'emma', time: 11.2 }, { name: 'luke', time: 12.8 }, { name: 'meg', time: 13.5 }, ] const getQualifiedRunners = compose([ keepSub13Times, mapValues(get('name')), ]) const qualifiedRunners = getQualifiedRunners( oneHundredMeterTimes ) console.log(qualifiedRunners) // is [ // emma // luke // ]
type Runner = { name: string time: number } const isSub13m = ({ time }: Runner) => time < 13 const keepSub13Times = keepFirstWhile(isSub13m) const oneHundredMeterTimes: Runner[] = [ { name: 'emma', time: 11.2 }, { name: 'luke', time: 12.8 }, { name: 'meg', time: 13.5 }, ] const getName = get('name')<Runner> const getQualifiedRunners = compose([ keepSub13Times, mapValues(getName)<Runner[]>, ]) const qualifiedRunners = getQualifiedRunners( oneHundredMeterTimes ) console.log(qualifiedRunners) // is [ // emma // luke // ]