keepLastWhile

keepLastWhile

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

    const keepLastWhileGt1 = keepLastWhile(n => n > 1)
    
    keepLastWhileGt1([1, 2, 3]) // is [2, 3]
    keepLastWhileGt1([2, 3, 1]) // is []
    const keepLastWhileGt1 = keepLastWhile((n: number) => n > 1)
    
    keepLastWhileGt1([1, 2, 3]) // is [2, 3]
    keepLastWhileGt1([2, 3, 1]) // is []
    
    const keepLastWhileGt1 = keepLastWhile(n => n > 1)
    
    keepLastWhileGt1([1, 2, 3]) // is [2, 3]
    keepLastWhileGt1([2, 3, 1]) // is []
    const keepLastWhileGt1 = keepLastWhile(
      (n: number) => n > 1
    )
    
    keepLastWhileGt1([1, 2, 3]) // is [2, 3]
    keepLastWhileGt1([2, 3, 1]) // is []
    
  2. Sometimes we have ordered data and only care about the last elements. Below, we are running a streaming service and have added a few new cooking shows. We only renew shows with at least a thousand views, so let's list the ones we need to cancel.

    const shows = [
      { name: "Cake'n'Bake", views: 2047 },
      { name: "Greg's Grills", views: 688 },
      { name: "Let's Brunch", views: 512 },
    ]
    
    const shouldCancel = ({ views }) => views < 1000
    
    const getCanceledShows = compose([
      keepLastWhile(shouldCancel),
      mapValues(get('name')),
    ])
    
    const canceledShows = getCanceledShows(shows)
    console.log(canceledShows)
    // is [
    //   Greg's Grills
    //   Let's Brunch
    // ]
    type Show = {
      name: string
      views: number
    }
    
    const shows: Show[] = [
      { name: "Cake'n'Bake", views: 2047 },
      { name: "Greg's Grills", views: 688 },
      { name: "Let's Brunch", views: 512 },
    ]
    
    const shouldCancel = ({ views }: Show) => views < 1000
    const getName = get('name')<Show>
    
    const getCanceledShows = compose([
      keepLastWhile(shouldCancel)<Show[]>,
      mapValues(getName)<Show[]>,
    ])
    
    const canceledShows = getCanceledShows(shows)
    console.log(canceledShows)
    // is [
    //   Greg's Grills
    //   Let's Brunch
    // ]
    
    const shows = [
      { name: "Cake'n'Bake", views: 2047 },
      { name: "Greg's Grills", views: 688 },
      { name: "Let's Brunch", views: 512 },
    ]
    
    const shouldCancel = ({ views }) => views < 1000
    
    const getCanceledShows = compose([
      keepLastWhile(shouldCancel),
      mapValues(get('name')),
    ])
    
    const canceledShows = getCanceledShows(shows)
    console.log(canceledShows)
    // is [
    //   Greg's Grills
    //   Let's Brunch
    // ]
    type Show = {
      name: string
      views: number
    }
    
    const shows: Show[] = [
      { name: "Cake'n'Bake", views: 2047 },
      { name: "Greg's Grills", views: 688 },
      { name: "Let's Brunch", views: 512 },
    ]
    
    const shouldCancel = ({ views }: Show) =>
      views < 1000
    const getName = get('name')<Show>
    
    const getCanceledShows = compose([
      keepLastWhile(shouldCancel)<Show[]>,
      mapValues(getName)<Show[]>,
    ])
    
    const canceledShows = getCanceledShows(shows)
    console.log(canceledShows)
    // is [
    //   Greg's Grills
    //   Let's Brunch
    // ]