Code Monkey home page Code Monkey logo

lz's Introduction

lz

Build Status NPM version

the fastest¹ functional lazy library for JavaScript.

this isn't an FP do-it-all library² -- this is a collection of useful functions for working with lists and text as efficiently as possible.

Examples

Fizzbuzz

var three = lz.cycle(['', '', 'fizz'])
var five = lz.cycle(['', '', '', '', 'buzz'])
var fizzbuzz = lz.zipWith(function (a, b) { return a + b }, three, five)

fizzbuzz.take(5).toArray()

Factorial

  // Return factorial of 4
  // note you should use `new` but you don't have to
  new lz([1, 2, 3, 4]).scanl(function (a, b) { return a * b }).at(3)

ProjectEuler Problem 1

  lz.range(1, 999)
  .filter(function (n) { return n % 3 === 0 || n % 5 === 0 })
  .foldl(function (a, b) { return a + b })

API

chainable

The following functions return this (Object lz)

compact()

Lazily removes falsy (undefined, null, "", 0, NaN) values from the list.

[true, false, true, false]
  .lz()
  .compact()
  .take(2)
  .toArray()
// = [true, true]

concat(Array || [Object lz])

Lazily concatenate the list passed in to the current list.

['hello']
  .lz()
  .concat(['laziness'])
  .take(2)
  .toArray()
// = ['hello', 'laziness']

[1]
  .lz()
  .concat(lz.cycle([2]))
  .take(4)
  .toArray()
/// = [1, 2, 2, 2]

cycle()

Generates an infinite loop composed of the elements of the current list.

['Na']
  .lz()
  .cycle()
  .take(10)
  .toString(' ') + ' Batman!'
// = Na Na Na Na Na Na Na Na Na Na Batman!

drop(Number)

Removes the amount provided, starting from the current position, from the collection.

[null, null, 1, 2, 3].lz().drop(2).toArray()
// = [1, 2, 3]

dropWhile(Function)

Drops elements from the collection until the function provided returns false.

[1, 2, 3, 4, 5]
  .lz()
  .dropWhile(function (n) { return n < 4 })
  .toArray()
// = [4, 5]

filter(Function)

Lazily removes elements from the collection if the return value from the function provided is not true.

[{ color: 'red' }, { color: 'blue' }, { color: 'pink' }, { color: 'red' }]
  .lz()
  .filter(function (x) { return x.color === 'red' })
  .toArray()
// = [{ color: 'red' }, { color: 'red' }]

flatten(Boolean)

Flattens a nested Array. If shallow is truthy Array is flattened to a single level.

[[1], [2], [3]].lz().flatten().toArray()
// = [1, 2, 3]

init()

Returns all the elements from the collection except for the last one.

[1, 2, 3, 4, 5].lz().init().toArray()
// = [1, 2, 3, 4]

map(Function)

Lazily applies the function provided to each element and replaces the element with the value returned from the function.

['m', 'a', 'p']
  .lz()
  .map(function (a) { return a.toUpperCase() })
  .toArray()
  .join('')
// = 'MAP'

scanl(Function)

Similar to a map and a fold. Lazily returns a list of successive reduced values from the left.

[1, 2, 3]
  .lz()
  .scanl(function (a, b) { return a + b })
  .toArray()
// = [1, 3, 6]

sort(Function)

Array prototype method.

tail()

Extract the elements after the head of a list.

[1, 2, 3, 4, 5].lz().last().toArray()
// = [2, 3, 4, 5]

take(Number)

Replaces the collection with the amount taken from the current collection.

lz('my name is lz').take(2).toString()
// = 'my'

takeWhile(Function)

Replaces the collection with the values taken from the current collection which when applied to the callback function return true.

[1, 2, 3, 4, 5]
  .lz()
  .takeWhile(function (n) { return n < 4 })
  .toArray()
// = [1, 2, 3]

zipWith(Function, Array)

Takes the current list and the list passed in and applies the function to each element in both lists generating a new list from the result.

[1, 2]
  .lz()
  .zipWith(function (a, b) { return a + b }, [2, 1])
  .toArray()
// = [3, 3]

value

These functions return a value.

all(Function)

Applies the function to each element in the collection, returns false if the return value from the function for any of the elements is false, otherwise returns true.

[2, 4, 6, 8, 10]
  .lz()
  .all(function (n) { return n % 2 === 0 })
// = true

and()

Returns false if any element in the list is falsy, otherwise returns true.

[null].lz().and()
// = false

lz('i am true to you').and()
// = true

any(Function)

Applies the function to each element in the collection, returns true if the return value from the function for any of the elements is true, otherwise returns false.

[10, 9, 8, 7, 6]
  .lz()
  .any(function (n) { return n === 9 })
// = true

at(Number)

Returns the element at the index provided. It's zero-based.

lz('chocolate').at(3)
// = 'c'

lz([1, 2, 3]).at(0)
// = 1

foldl(Function)

Reduces the list down to a single value from left to right.

[1, 2, 3, 4, 5]
  .lz()
  .foldl(function (a, b) { return a + b })
// = 15

elem(Generic)

Returns true if the list contains the item provided.

[1, 2, 3, 4, 5]
  .lz()
  .elem(6)
// = false

[null, 0, false, NaN, undefined]
  .lz()
  .elem(NaN)
// = true

head()

Extracts the first element of the collection.

lz('first').head()
// = 'f'

last()

Extracts the last element in the collection.

lz('last').last()
// = 't'

nil()

Returns true if the list is empty or filled with empty values. Otherwise returns false.

[].lz().nil()
// = true

[null, null].lz().nil()
// = true

[false].lz().nil()
// = false

max(Function)

Returns the largest element in the collection. If a function is provided the callback function will be applied to each element before comparing.

[1, 2, 3].lz().max()
// = 3

min(Function)

Returns the smallest element in the collection. If a function is provided the callback function will be applied to each element before comparing.

[1, 2, 3].lz().min()
// = 1

or()

Returns true if any element in the list is truthy, otherwise returns false.

[true, false, true].lz().or()
// = true

toArray()

Forceful method which returns an Array. Alias is $().

[1, 2, 3].lz().take(2).toArray()
// = [1, 2]

toString()

Forceful method which returns the result as a String.

lz('Bananas').toString()
// = Bananas

static

These functions are part of the lz Object namespace.

concatMap(Function, Array)

Returns a list by applying the function provided to all elements in the list and then concatenating the returned list into the result.

lz.concatMap(function (a) { return [a, a] }, [1, 2, 3])
// = [1, 1, 2, 2, 3, 3]

cycle(Array)

See lz.prototype.cycle.

flatten(Array, Boolean)

See lz.prototype.flatten.

foldl(Function, Array)

See lz.prototype.foldl.

iterate(Function, Number)

Creates an infinite list by applying the function repeatedly to the last element in the list, starting with the number provided.

lz.iterate(function (x) { return x + 1 }, 1).take(5).toArray()
// = [1, 2, 3, 4, 5]

lines(String)

Convert a string into a list split by lines.

lz.lines('1. One\n2. Two').toArray()
// = ['1. One', '2. Two']

max(Array, Function)

See lz.prototype.max.

min(Array, Function)

See lz.prototype.min.

range(Number, Number)

Create a finite or infinite list from a range of numbers.

lz.range(1, Infinity).take(5).toArray()
// = [1, 2, 3, 4, 5]

lz.range(5, 10).toArray()
// = [5, 6, 7, 8, 9, 10]

lz.range(1, 10).filter(function (x) { return x % 3 === 0 }).toArray()
// = [3, 6, 9]

repeat(Number)

Creates an infinite list with just a single Number as the value. Same as lz.cycle([Number])

lz.repeat(4).take(7).toArray()
// = [4, 4, 4, 4, 4, 4, 4]

lz.repeat('ya').take(3).toString(' ')
// = 'ya ya ya'

replicate(Number, Number)

Creates a finite list with just a single Number as the value. Similar to lz.repeat(Number).take(Number)

lz.replicate(3, 1).toArray()
// = [1, 1, 1]

lz.replicate(1, 3).toArray()
// = [3]

words(String)

Convert a string into a list split by words.

lz.lines('My cat is also lazy').toArray()
// = ['My', 'cat', 'is', 'also', 'lazy']

zipWith(Function, Array, Array)

See lz.prototype.zipWith.

Speed

It's fast-as-fuck™.

I have included benchmarks in the repo so you can run them for yourself.

If you're working with small lists and/or iterating through all elements in a collection then I recommend lo-dash.

If you plan on being lazy or working with infinite lists then this is the right tool for that job.

Your mileage may vary.

License

MIT

lz's People

Contributors

goatslacker avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.