mKeepFirstWhile

mKeepFirstWhile

  • (predicate: Predicate) => (anArray: array) => anArray
  1. Keep the first elements of an array that pass a condition

    Consider keepFirstWhile instead.
    This is for the uncommon case where mutating anArray is required.

    const lt3 = n => n < 3
    const mKeepFirstWhileLt3 = mKeepFirstWhile(lt3)
    
    const arr = [1, 2, 3, 4]
    const mutatedArr = mKeepFirstWhileLt3(arr)
    console.log(mutatedArr === arr) // is true
    console.log(arr) // is [1, 2]
    const lt3 = (n: number) => n < 3
    const mKeepFirstWhileLt3 = mKeepFirstWhile(lt3)
    
    const arr = [1, 2, 3, 4]
    const mutatedArr = mKeepFirstWhileLt3(arr)
    console.log(mutatedArr === arr) // is true
    console.log(arr) // is [1, 2]
    
    const lt3 = n => n < 3
    const mKeepFirstWhileLt3 = mKeepFirstWhile(lt3)
    
    const arr = [1, 2, 3, 4]
    const mutatedArr = mKeepFirstWhileLt3(arr)
    console.log(mutatedArr === arr) // is true
    console.log(arr) // is [1, 2]
    const lt3 = (n: number) => n < 3
    const mKeepFirstWhileLt3 = mKeepFirstWhile(lt3)
    
    const arr = [1, 2, 3, 4]
    const mutatedArr = mKeepFirstWhileLt3(arr)
    console.log(mutatedArr === arr) // is true
    console.log(arr) // is [1, 2]
    
  2. Sometimes we have ordered data and only care about the first elements. Below, we have students who sold magazine subscriptions, ordered by number sold. Students who sold ten or more get to ride a limo over lunch. Let's see who rides the limo.

    const sellers = [
      { name: 'phil', numSold: 15 },
      { name: 'mary', numSold: 11 },
      { name: 'sarah', numSold: 8 },
    ]
    
    const soldAtLeast10 = ({ numSold }) => numSold >= 10
    const keepRewardRecipients = mKeepFirstWhile(soldAtLeast10)
    keepRewardRecipients(sellers)
    const getNames = mapValues(get('name'))
    const rewardRecipients = getNames(sellers)
    console.log(rewardRecipients)
    // is [
    //   phil
    //   mary
    // ]
    type Seller = {
      name: string
      numSold: number
    }
    const sellers: Seller[] = [
      { name: 'phil', numSold: 15 },
      { name: 'mary', numSold: 11 },
      { name: 'sarah', numSold: 8 },
    ]
    
    const soldAtLeast10 = ({ numSold }: Seller) => numSold >= 10
    const keepRewardRecipients = mKeepFirstWhile(soldAtLeast10)
    keepRewardRecipients(sellers)
    const getName = get('name')<Seller>
    const getAllNames = mapValues(getName)<Seller[]>
    const rewardRecipients = getAllNames(sellers)
    console.log(rewardRecipients)
    // is [
    //   phil
    //   mary
    // ]
    
    const sellers = [
      { name: 'phil', numSold: 15 },
      { name: 'mary', numSold: 11 },
      { name: 'sarah', numSold: 8 },
    ]
    
    const soldAtLeast10 = ({ numSold }) =>
      numSold >= 10
    const keepRewardRecipients = mKeepFirstWhile(
      soldAtLeast10
    )
    keepRewardRecipients(sellers)
    const getNames = mapValues(get('name'))
    const rewardRecipients = getNames(sellers)
    console.log(rewardRecipients)
    // is [
    //   phil
    //   mary
    // ]
    type Seller = {
      name: string
      numSold: number
    }
    const sellers: Seller[] = [
      { name: 'phil', numSold: 15 },
      { name: 'mary', numSold: 11 },
      { name: 'sarah', numSold: 8 },
    ]
    
    const soldAtLeast10 = ({ numSold }: Seller) =>
      numSold >= 10
    const keepRewardRecipients = mKeepFirstWhile(
      soldAtLeast10
    )
    keepRewardRecipients(sellers)
    const getName = get('name')<Seller>
    const getAllNames = mapValues(getName)<Seller[]>
    const rewardRecipients = getAllNames(sellers)
    console.log(rewardRecipients)
    // is [
    //   phil
    //   mary
    // ]