keepFirstWhile

keepFirstWhile

  • (predicate: Predicate) => (anArray: array) => array
  1. 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 []
    
  2. 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
    // ]