Functional tools for Javascript


Keywords
es2015, es5, es6, node, npm, package, functional, functions
License
WTFPL
Install
npm install rfuncs@1.4.3

Documentation

RFUNCS

A collection of amazing functions:

all

all(array)

  • Returns true if all values in the array are true
all()
// => true
all(true)
// => true
all(false)
// => false
all([true, true])
// => true
all([true, false])
// => false

all(array, func)

  • Returns true if all values in the array are true when applied to func
all(4, i => i <= 4)
// => true
all(4, i => i > 4)
// => false
all([2, 4], i => i <= 2)
// => false
all([2, 4], i => i <= 4)
// => true

any

any(array)

  • Returns true if at least one in the values in the array is true
any()
// => false
any(true)
// => true
any(false)
// => false
any([false, false])
// => false
any([true, false])
// => true

any(array, func)

  • Returns true if at least one in the values in the array is true when applied to func
any(4, i => i <= 4)
// => true
any(4, i => i > 4)
// => false
any([2, 4], i => i <= 2)
// => true
any([2, 4], i => i <= 4)
// => true
any([2, 4], i => i <= 1)
// => false

apply

apply(f, [val₁, val₂, val₃, …])

  • returns f(val₁, val₂, val₃, …)
apply(a => a + 2, 1)
// => 3
apply(a => a + 2, [1])
// => 3
apply((a, b) => a + b, [1, 2])
// => 3
apply((a, b, c) => a + b + c, [1, 2, 3])
// => 6

composition

composition(f₁, f₂, f₃, …)

  • returns a composition of the functions f₁, f₂, f₃, …
composition()(4)
// => 4
composition(a => a + 2)(4)
// => 6
composition(
    a => a + 2,
    a => a * 3
)(4)
// => 18
composition(
    a => a + 2,
    a => a * 3,
    a => a / 2
)(4)
// => 9

contains

contains(data, value)

  • returns true if value is contained in data
contains([1, 2, 3], 2)
// => true
contains([1, 2, 3], 8)
// => false
contains({ a: 1, b: 2 }, "a")
// => true
contains({ a: 1, b: 2 }, "c")
// => false
contains(1, 1)
// => true

delete_duplicates

delete_duplicates(iterable)

  • deletes all duplicates from list.
delete_duplicates([1, 1, 3])
// => [1,3]
delete_duplicates([1, 7, 8, 4, 3, 4, 1, 9, 9, 2])
// => [1,7,8,4,3,9,2]
delete_duplicates([])
// => []
delete_duplicates([{ a: 2, b: 3 }, { a: 2 }], "a")
// => [{"a":2}]
delete_duplicates([{ a: 2, b: 3 }, { a: 2 }], o => o.a)
// => [{"a":2}]

filter

filter(data, crit)

  • picks out all elements xₑ of data for which crit(data[e], e) is True
filter(v => v < 3, [1, 2, 3])
// => [1,2]
filter(v => v < 3, 1)
// => [1]
filter(v => v < 3, 5)
// => []
filter(v => v < 3, { a: 2, b: 5 })
// => {"a":2}
filter((v, index) => v == index, [0, 1, 2, 4])
// => [0,1,2]
filter((v, index) => v == index, 0)
// => [0]
filter((v, index) => v == index, 1)
// => []
filter((v, index) => v == index, { a: "a", b: "c" })
// => {"a":"a"}

first

first(1)
// => 1
first([1, 2, 3])
// => 1
first({ a: 1, b: 2 })
// => 1

getter

getter()({ a: 2 })
// => {"a":2}
getter("a")({ a: 2 })
// => 2
getter(["a", "b"])({ a: 2, b: 3 })
// => [2,3]
getter({ x: "a", z: "b" })({ a: 2, b: 3 })
// => {"x":2,"z":3}
getter(a => a + 2)(0)
// => 2
getter([null, null])(0)
// => [2,4]
getter({})(0)
// => {"a":2,"b":4}

group_by

group_by([1, 1, 2, 3])
// => {"1":[1,1],"2":[2],"3":[3]}
group_by([{ a: 2 }, { a: 3 }, { a: 2, b: 4 }], "a")
// => {"2":[{"a":2},{"a":2,"b":4}],"3":[{"a":3}]}
group_by([{ a: 2 }, { a: 3 }, { a: 2, b: 4 }], v => v.a)
// => {"2":[{"a":2},{"a":2,"b":4}],"3":[{"a":3}]}
group_by({ a: 1, b: 1, c: 2, d: 3 })
// => {"1":{"a":1,"b":1},"2":{"c":2},"3":{"d":3}}
group_by({ x: { a: 2 }, y: { a: 3 }, z: { a: 2, b: 4 } }, "a")
// => {"2":{"x":{"a":2},"z":{"a":2,"b":4}},"3":{"y":{"a":3}}}
group_by({ x: { a: 2 }, y: { a: 3 }, z: { a: 2, b: 4 } }, v => v.a)
// => {"2":{"x":{"a":2},"z":{"a":2,"b":4}},"3":{"y":{"a":3}}}
group_by(
    [1, 1, 2, 2, 3],
    v => v,
    array => array.reduce((a, b) => a + b, 0)
)
// => {"1":2,"2":4,"3":3}

identity

identity(val)

  • gives val (the identity operation)
identity()
// => null
identity(2)
// => 2
identity([1, 2, 3])
// => [1,2,3]

is_array

is_array("a")
// => false
is_array(0)
// => false
is_array([])
// => true
is_array({})
// => false
is_array(null)
// => false
is_array()
// => false

is_function

is_function("a")
// => false
is_function(0)
// => false
is_function([])
// => false
is_function({})
// => false
is_function(null)
// => false
is_function()
// => false
is_function()
// => false
is_function(() => 1)
// => true
is_function(function () {})
// => true

is_iterator

is_iterator([1, 2, 3])
// => false
function* iter() {
    yield 1
}
is_iterator(iter())
// => true

is_null

is_null("a")
// => false
is_null(0)
// => false
is_null([])
// => false
is_null({})
// => false
is_null(null)
// => true
is_null()
// => true

is_object

is_object("a")
// => false
is_object(0)
// => false
is_object([])
// => false
is_object({})
// => true
is_object({ 3: 1, 4: 2, 5: 3 })
// => true
is_object(null)
// => false
is_object()
// => false

items

items({})
// => []
items({ a: 1 })
// => [["a",1]]
items({ a: 1 }, { b: 2 })
// => [["a",1],["b",2]]
items({ a: 1 }, { b: 2 }, { c: 3 })
// => [["a",1],["b",2],["c",3]]
items({ a: 1, b: 2 }, { b: 3 })
// => [["a",1],["b",2],["b",3]]

key_drop

key_drop({ a: "b", c: "d", e: "f", k: "p" }, "a")
// => {"c":"d","e":"f","k":"p"}
key_drop({ a: "b", c: "d", e: "f", k: "p" }, ["c", "k"])
// => {"a":"b","e":"f"}
key_drop({ a: "b", c: "d", e: "f", k: "p" }, ["a", "c", "z"])
// => {"e":"f","k":"p"}
key_drop({ a: "b", c: "d", e: "f", k: "p" })
// => {"a":"b","c":"d","e":"f","k":"p"}

key_take

key_take({ a: "b", c: "d", e: "f" }, "a")
// => {"a":"b"}
key_take({ a: "b", c: "d", e: "f" }, ["a", "c"])
// => {"a":"b","c":"d"}
key_take({ a: "b", c: "d", e: "f" }, ["a", "c", "z"])
// => {"a":"b","c":"d"}
key_take({ a: "b", c: "d", e: "f" })
// => {"a":"b","c":"d","e":"f"}
key_take({ a: "b", c: "d", e: "f" }, ["a", "c", "z", "j"], 3)
// => {"a":"b","c":"d","z":3,"j":3}
key_take({ a: "b", c: "d", e: "f" }, ["a", "c", "z", "j"], null)
// => {"a":"b","c":"d","z":null,"j":null}

keys

keys({ a: "b", c: "d", e: "f" })
// => ["a","c","e"]

last

last(1)
// => 1
last([1, 2, 3])
// => 3
last({ a: 1, b: 2 })
// => 2

length

length()
// => 0
length(1)
// => 1
length("foo")
// => 1
length([1])
// => 1
length([1, 2, 3])
// => 3
length({ a: 2 })
// => 1
length({ a: 2, b: 3 })
// => 2

map

map(v => v + 2, [1, 2, 3])
// => [3,4,5]
map(v => v + 2, 1)
// => [3]
map(v => v + 2, { a: 3, b: 5 })
// => {"a":5,"b":7}
map((v, index) => v + index, [1, 2, 3])
// => [1,3,5]
map((v, index) => v + index, 1)
// => [1]
map((v, index) => v + index, { a: 3 })
// => {"a":"3a"}

merge

merge()
// => {}
merge({ a: 1 })
// => {"a":1}
merge({ a: 1 }, { b: 2 })
// => {"a":1,"b":2}
merge({ a: 1 }, { b: 2 }, { c: 3 })
// => {"a":1,"b":2,"c":3}
merge({ a: 1, b: 2 }, { b: 3 })
// => {"a":1,"b":3}

nest

nest(s => s + "b", "a", 0)
// => "a"
nest(s => s + "b", "a", 1)
// => "ab"
nest(s => s + "b", "a", 5)
// => "abbbbb"

object_map

object_map(
    v => v,
    v => v + 2,
    [1, 2, 3]
)
// => {"1":3,"2":4,"3":5}
object_map(
    v => v,
    v => v + 2,
    1
)
// => {"1":3}
object_map(
    (v, i) => i + 1,
    (v, i) => v + 2,
    [4, 5, 6]
)
// => {"1":6,"2":7,"3":8}
object_map(
    (v, i) => i + 1,
    (v, i) => v + 2,
    3
)
// => {"1":5}
object_map(
    (v, i) => i + 1,
    (v, i) => v + 2,
    {}
)
// => {"1":3,"2":4}

ordered_object

ordered_object([["a", 2]])
// => {"a":2}
ordered_object([
    ["z", 2],
    ["b", 3],
])
// => {"z":2,"b":3}
ordered_object([
    ["z", 2],
    ["b", 3],
    ["b", 4],
])
// => {"z":2,"b":4}

part

part(
    {
        person: {
            "pk.0": { pk: "pk.0", full_name: "Deanna Gardner" },
            "pk.1": { pk: "pk.1", full_name: "Brian Rodriguez" },
            "pk.2": { pk: "pk.2", full_name: "Rebecca Burke" },
            "pk.3": { pk: "pk.3", full_name: "Brian Taylor" },
            "pk.4": { pk: "pk.4", full_name: "Heather Watkins" },
            "pk.5": { pk: "pk.5", full_name: "Chris Villegas" },
            "pk.6": { pk: "pk.6", full_name: "Danielle Henderson" },
            "pk.7": { pk: "pk.7", full_name: "Matthew Ramirez" },
        },
        transaction: {
            "pk.0": { pk: "pk.0", amount: 370 },
            "pk.1": { pk: "pk.1", amount: 930 },
            "pk.2": { pk: "pk.2", amount: 740 },
            "pk.3": { pk: "pk.3", amount: 560 },
        },
    },
    "person",
    "pk.0",
    "full_name"
)
// => ["Deanna Gardner"]
part(
    {
        person: {
            "pk.0": { pk: "pk.0", full_name: "Deanna Gardner" },
            "pk.1": { pk: "pk.1", full_name: "Brian Rodriguez" },
            "pk.2": { pk: "pk.2", full_name: "Rebecca Burke" },
            "pk.3": { pk: "pk.3", full_name: "Brian Taylor" },
            "pk.4": { pk: "pk.4", full_name: "Heather Watkins" },
            "pk.5": { pk: "pk.5", full_name: "Chris Villegas" },
            "pk.6": { pk: "pk.6", full_name: "Danielle Henderson" },
            "pk.7": { pk: "pk.7", full_name: "Matthew Ramirez" },
        },
        transaction: {
            "pk.0": { pk: "pk.0", amount: 370 },
            "pk.1": { pk: "pk.1", amount: 930 },
            "pk.2": { pk: "pk.2", amount: 740 },
            "pk.3": { pk: "pk.3", amount: 560 },
        },
    },
    "person",
    ["pk.0", "pk.1"],
    "full_name"
)
// => ["Deanna Gardner","Brian Rodriguez"]
part(
    {
        person: {
            "pk.0": { pk: "pk.0", full_name: "Deanna Gardner" },
            "pk.1": { pk: "pk.1", full_name: "Brian Rodriguez" },
            "pk.2": { pk: "pk.2", full_name: "Rebecca Burke" },
            "pk.3": { pk: "pk.3", full_name: "Brian Taylor" },
            "pk.4": { pk: "pk.4", full_name: "Heather Watkins" },
            "pk.5": { pk: "pk.5", full_name: "Chris Villegas" },
            "pk.6": { pk: "pk.6", full_name: "Danielle Henderson" },
            "pk.7": { pk: "pk.7", full_name: "Matthew Ramirez" },
        },
        transaction: {
            "pk.0": { pk: "pk.0", amount: 370 },
            "pk.1": { pk: "pk.1", amount: 930 },
            "pk.2": { pk: "pk.2", amount: 740 },
            "pk.3": { pk: "pk.3", amount: 560 },
        },
    },
    null,
    "pk.0",
    "pk"
)
// => ["pk.0","pk.0"]
part(
    {
        person: {
            "pk.0": { pk: "pk.0", full_name: "Deanna Gardner" },
            "pk.1": { pk: "pk.1", full_name: "Brian Rodriguez" },
            "pk.2": { pk: "pk.2", full_name: "Rebecca Burke" },
            "pk.3": { pk: "pk.3", full_name: "Brian Taylor" },
            "pk.4": { pk: "pk.4", full_name: "Heather Watkins" },
            "pk.5": { pk: "pk.5", full_name: "Chris Villegas" },
            "pk.6": { pk: "pk.6", full_name: "Danielle Henderson" },
            "pk.7": { pk: "pk.7", full_name: "Matthew Ramirez" },
        },
        transaction: {
            "pk.0": { pk: "pk.0", amount: 370 },
            "pk.1": { pk: "pk.1", amount: 930 },
            "pk.2": { pk: "pk.2", amount: 740 },
            "pk.3": { pk: "pk.3", amount: 560 },
        },
    },
    "person",
    ["pk.1", "pk.7"]
)
// => [{"pk":"pk.1","full_name":"Brian Rodriguez"},{"pk":"pk.7","full_name":"Matthew Ramirez"}]

random_choice

random_integer

random_real

range

range(0)
// => []
range(5)
// => [0,1,2,3,4]
range(0, 0)
// => [0]
range(1, 5)
// => [1,2,3,4,5]
range(0, 4)
// => [0,1,2,3,4]
range(0, 4, 2)
// => [0,2,4]

repeat

repeat(1)
// => [1]
repeat(1, 3)
// => [1,1,1]
repeat(1, 0)
// => []

riffle

riffle(iterable, separator)

  • riffle separator between successive elements in a list
riffle([1, 2, 3], "s")
// => [1,"s",2,"s",3]
riffle([1], "s")
// => [1]
riffle([], "s")
// => []

scan

scan(v => console.log(a), [1, 2, 3])
1
2
3
// =>
scan(v => console.log(a), { a: 2, b: 3, c: 4 })
2
3
4
// =>
scan((v, i) => console.log(i), [1, 2, 3])
0
1
2
// =>
scan((v, i) => console.log(i), { a: 2, b: 3, c: 4 })
a
b
c
// =>

sort

sort([3, 1, 2])
// => [1,2,3]
sort([3, 1, 2], (a, b) => a > b)
// => [1,2,3]
sort([3, 1, 2], (a, b) => a < b)
// => [3,2,1]
sort({ a: 3, b: 1, c: 2 })
// => [1,2,3]
sort({ a: 3, b: 1, c: 2 }, (a, b) => a > b)
// => [1,2,3]
sort({ a: 3, b: 1, c: 2 }, (a, b) => a < b)
// => [3,2,1]
// => [3,1,2]
// => {"a":3,"b":1,"c":2}

sort_by

sort_by([4, 3, 10, 2])
// => [2,3,4,10]
sort_by(
    [
        [2, "b"],
        [1, "a"],
    ],
    arr => arr[0]
)
// => [[1,"a"],[2,"b"]]
sort_by(
    [
        [2, 3],
        [2, 1],
        [1, 1],
    ],
    [null, null]
)
// => [[1,1],[2,1],[2,3]]
sort_by(
    [
        [2, 3],
        [2, 1],
        [1, 1],
    ],
    [0, 1]
)
// => [[1,1],[2,1],[2,3]]
sort_by([{ a: 2 }, { a: 3 }, { a: 1 }], "a")
// => [{"a":1},{"a":2},{"a":3}]
sort_by(
    [
        { a: 2, b: 3 },
        { a: 2, b: 1 },
        { a: 1, b: 1 },
    ],
    ["a", "b"]
)
// => [{"a":1,"b":1},{"a":2,"b":1},{"a":2,"b":3}]

to_array

to_array(0)
// => [0]
to_array("a")
// => ["a"]
to_array([0, 1, 2, [3, 4], { a: 5 }])
// => [0,1,2,[3,4],{"a":5}]
to_array({ a: 1, b: 2, c: [3, 4], d: { a: 5 } })
// => [1,2,[3,4],{"a":5}]
to_array()
// => []
to_array("", 0, 1, 2, 3)
// => ["",0,1,2,3]
to_array("", 0, 1, [2, 3], 4)
// => ["",0,1,2,3,4]
to_array("", 0, 1, [2, 3], { a: 4, b: 5 })
// => ["",0,1,2,3,4,5]

values

values({ a: "b", c: "d", e: "f" })
// => ["b","d","f"]

zip

zip(array1, array2, ...)

  • returns [[array1[0], array2[0], ...], [array1[1], array2[1], ...], ...]
zip([1, 2, 3], [4, 5, 6])
// => [[1,4],[2,5],[3,6]]