# rambda **Repository Path**: mirrors_davidjbradshaw/rambda ## Basic Information - **Project Name**: rambda - **Description**: Faster alternative to Ramda in just 10kB - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-08-08 - **Last Updated**: 2026-04-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README [![CircleCI](https://circleci.com/gh/selfrefactor/rambda/tree/master.svg?style=svg)](https://circleci.com/gh/selfrefactor/rambda/tree/master) [![codecov](https://codecov.io/gh/selfrefactor/rambda/branch/master/graph/badge.svg)](https://codecov.io/gh/selfrefactor/rambda) [![dependencies Status](https://david-dm.org/selfrefactor/rambda/status.svg)](https://david-dm.org/selfrefactor/rambda) # Rambda Faster alternative to **Ramda** - [Documentation](https://selfrefactor.github.io/rambda/#/) ## Rambda's advantages - Tree-shaking Currenly **Rambda** is more tree-shakable than **Ramda** as you can see in this [tree-shaking example](https://github.com/selfrefactor/tree-shaking-example). - Speed **Rambda** is generally more performant than `Ramda` as the benchmarks can prove that. You can clone this repo and run `yarn run benchmark all` to see for yourself. - dot notation for `R.path` Standard usage of `R.path` is `R.path(['a', 'b'], {a: {b: 1} })`. In **Rambda** you have the choice to use dot notation(which is arguably more readable): ``` R.path('a.b', {a: {b: 1} }) ``` - comma notation for `R.pick` and `R.omit` Similar to dot notation, but the separator is comma(`,`) instead of dot(`.`). ``` R.pick('a,b', {a: 1 , b: 2, c: 3} }) // No space allowed between properties ``` - Typescript included Typescript definitions are included in the library, in comparison to **Ramda**, where you need to additionally install `@types/ramda`. --- **Rambda** partially shadows **Ramda**'s API, which means that you need to check **Rambda**'s documentation to assure that all the methods you need are available. ## Example use ```javascript const R = require('rambda') const result = R.compose( R.map(x => x * 2), R.filter(x => x > 2) )([1, 2, 3, 4]) // => [6, 8] ``` You can test this example in Rambda's REPL ## Install - Use **yarn add rambda** for `Webpack` and `Node.js` usage - For UMD usage either use `./dist/rambda.umd.js` or following CDN link: ``` https://cdnjs.cloudflare.com/ajax/libs/rambda/1.0.13/webVersion.js ``` ## Differences between Rambda and Ramda - Rambda's **type** detect async functions and unresolved `Promises`. The returned values are `'Async'` and `'Promise'`. - Rambda's **path** accepts dot notation(`'x.y' same as ['x','y']`) - Rambda's **pick** and **omit** accept comma notation(`'x,y' same as ['x','y']`) - Rambda's **map** and **filter** pass object key as second argument when mapping over objects. - Rambda's **startsWith/endsWith** work only with strings, instead with array and strings. - Rambda's **flip** works only for functions expecting two arguments. - Rambda's **equals** doesn't protect against circular structures as **Ramda.equals** does. - Rambda's **partialCurry** and **includes** are not part of Ramda API. > If you need more **Ramda** methods in **Rambda**, you may either submit a `PR` or check the extended version of **Rambda** - [Rambdax](https://github.com/selfrefactor/rambdax) ## API --- #### add > add(a: number, b: number): number ``` R.add(2, 3) // => 5 ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/add.js) Try in REPL --- #### addIndex > addIndex(fn: Function): Function ``` const mapWithIndex = R.addIndex(R.map) const result = mapWithIndex( (val, index) => `${val} - ${index}`, ['A', 'B', 'C'] ) // => ['A - 0', 'B - 1', 'C - 2'] ``` --- #### adjust > adjust(replaceFn: Function, i: number, arr: T[]): T[] It replaces `i` index in `arr` with the result of `replaceFn(arr[i])`. ``` R.adjust( a => a + 1, 0, [0, 100] ) // => [1, 100] ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/adjust.js) Try in REPL --- #### all > all(fn: Function, arr: T[]): boolean It returns `true`, if all members of array `arr` returns `true`, when applied as argument to function `fn`. ``` const arr = [ 0, 1, 2, 3, 4 ] const fn = x => x > -1 const result = R.all(fn, arr) // => true ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/all.js) Try in REPL --- #### allPass > allPass(rules: Function[], input: any): boolean It returns `true`, if all functions of `rules` return `true`, when `input` is their argument. ``` const input = { a : 1, b : 2, } const rules = [ x => x.a === 1, x => x.b === 2, ] const result = R.allPass(rules, input) // => true ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/allPass.js) Try in REPL --- #### always > always(x: any): Function It returns function that always returns `x`. ``` const fn = R.always(7) console.log(fn())// => 7 ``` --- #### any > any(condition: Function, arr: T[]): boolean It returns `true`, if at least one member of `arr` returns true, when passed to the `condition` function. ``` R.any(a => a * a > 8)([1, 2, 3]) // => true ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/any.js) Try in REPL --- #### anyPass > anyPass(conditions: Function[]): Function ``` const isBig = a => a > 20 const isOdd = a => a % 2 === 1 const result = R.anyPass( [isBig, isOdd] )(11) // => true ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/anyPass.js) Try in REPL --- #### append > append(valueToAppend: T, arr: T[]): T[] ``` R.append( 'foo', ['bar', 'baz'] ) // => ['bar', 'baz', 'foo'] ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/append.js) Try in REPL --- #### both > both(firstCondition: Function, secondCondition: Function, input: any): boolean It returns `true`, if both function `firstCondition` and function `secondCondition` return `true`, when `input` is their argument. ``` const fn = R.both( a => a > 10, a => a < 20 ) console.log(fn(15)) //=> true console.log(fn(30)) //=> false ``` --- #### compose > compose(fn1: Function, ... , fnN: Function): any It performs right-to-left function composition. ``` const result = R.compose( R.map(x => x * 2), R.filter(x => x > 2) )([1, 2, 3, 4]) // => [6, 8] ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/compose.js) Try in REPL --- #### complement > complement(fn: Function): Function It returns `complemented` function that accept `input` as argument. The return value of `complemented` is the negative boolean value of `fn(input)`. ``` const fn = R.complement(x => !x) const result = fn(false) // => false ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/complement.js) Try in REPL --- #### concat > concat(x: T[]|string, y: T[]|string): T[]|string It returns a new string or array, which is the result of merging `x` and `y`. ``` R.concat([1, 2])([3, 4]) // => [1, 2, 3, 4] R.concat('foo')('bar') // => 'foobar' ``` --- #### contains > contains(valueToFind: T, arr: T[]): boolean It returns `true`, if `valueToFind` is part of `arr`. ``` R.contains(2, [1, 2]) // => true R.contains(3, [1, 2]) // => false ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/contains.js) Try in REPL --- #### curry > curry(fn: Function): Function It returns curried version of `fn`. ``` const addFourNumbers = (a, b, c, d) => a + b + c + d const curriedAddFourNumbers = R.curry(addFourNumbers) const f = curriedAddFourNumbers(1, 2) const g = f(3) const result = g(4) // => 10 ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/curry.js) Try in REPL --- #### dec > dec(x: number): number It decrements a number. ``` R.dec(2) // => 1 ``` --- #### defaultTo > defaultTo(defaultValue: T, inputArgument: any): T It returns `defaultValue`, if `inputArgument` is `undefined`, `null` or `NaN`. It returns `inputArgument` in any other case. ``` R.defaultTo('foo', undefined) // => 'foo' R.defaultTo('foo', 'bar') // => 'bar' ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/defaultTo.js) Try in REPL --- #### dissoc > dissoc(prop: any, obj: object): object It returns a new object that does not contain a `prop` property. ``` R.dissoc('b', {a: 1, b: 2, c: 3}) //=> {a: 1, c: 3} ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/dissoc.js) Try in REPL --- #### divide ``` R.divide(71, 100) // => 0.71 ``` --- #### drop > drop(howManyToDrop: number, arrOrStr: T[]|string): T[]|String It returns `arrOrStr` with `howManyToDrop` items dropped from the left. ``` R.drop(1, ['foo', 'bar', 'baz']) // => ['bar', 'baz'] R.drop(1, 'foo') // => 'oo' ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/drop.js) Try in REPL --- #### dropLast > dropLast(howManyToDrop: number, arrOrStr: T[]|String): T[]|String It returns `arrOrStr` with `howManyToDrop` items dropped from the right. ``` R.dropLast(1, ['foo', 'bar', 'baz']) // => ['foo', 'bar'] R.dropLast(1, 'foo') // => 'fo' ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/dropLast.js) Try in REPL --- #### endsWith > endsWith(x: string, str: string): boolean ``` R.endsWith( 'bar', 'foo-bar' ) // => true R.endsWith( 'foo', 'foo-bar' ) // => false ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/endsWith.js) Try in REPL --- #### either > endsWith(firstCondition: Function, secondCondition: Function): Function ``` R.either( a => a > 10, a => a % 2 === 0 )(15) //=> true ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/either.js) Try in REPL --- #### equals > equals(a: any, b: any): boolean It returns equality match between `a` and `b`. It doesn't handle cyclical data structures. ``` R.equals( [1, {a:2}, [{b:3}]], [1, {a:2}, [{b:3}]] ) // => true ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/equals.js) Try in REPL --- #### F `R.F() // => false` --- #### filter > filter(filterFn: Function, x: Array|Object): Array|Object It filters `x` iterable over boolean returning `filterFn`. ``` const filterFn = a => a % 2 === 0 const result = R.filter(filterFn, [1, 2, 3, 4]) // => [2, 4] ``` The method works with objects as well. Note that unlike Ramda's `filter`, here object keys are passed as second argument to `filterFn`. ``` const result = R.filter((val, prop)=>{ return prop === 'a' || val === 2 }, {a: 1, b: 2, c: 3}) // => {a: 1, b: 2} ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/filter.js) Try in REPL --- #### find > find(findFn: Function, arr: T[]): T|undefined It returns `undefined` or the first element of `arr` satisfying `findFn`. ``` const findFn = a => R.type(a.foo) === 'Number' const arr = [{foo: 'bar'}, {foo: 1}] const result = R.find(findFn, arr) // => {foo: 1} ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/find.js) Try in REPL --- #### findIndex > findIndex(findFn: Function, arr: T[]): number It returns `-1` or the index of the first element of `arr` satisfying `findFn`. ``` const findFn = a => R.type(a.foo) === 'Number' const arr = [{foo: 'bar'}, {foo: 1}] const result = R.findIndex(findFn, arr) // => 1 ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/findIndex.js) Try in REPL --- #### flatten > flatten(arr: any[]): any[] ``` R.flatten([ 1, [ 2, [ 3 ] ] ]) // => [ 1, 2, 3 ] ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/flatten.js) Try in REPL --- #### flip > flip(fn: Function): Function It returns function which calls `fn` with exchanged first and second argument. ``` const subtractFlip = R.flip(R.subtract) const result = subtractFlip(1,7) // => 6 ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/flip.js) Try in REPL --- #### forEach > forEach(fn: Function, arr: Array): Array It applies function `fn` over all members of array `arr` and returns `arr`. ``` const sideEffect = {} const result = R.forEach( x => sideEffect[`foo${x}`] = x )([1, 2]) console.log(sideEffect) //=> {foo1 : 1, foo2 : 2} console.log(result) //=> [1, 2] ``` Note, that unlike `Ramda`'s **forEach**, Rambda's one doesn't dispatch to `forEach` method of `arr` if `arr` has such method. [Source](https://github.com/selfrefactor/rambda/tree/master/modules/forEach.js) Try in REPL --- #### has > has(prop: string, obj: Object): boolean - It returns `true` if `obj` has property `prop`. ``` R.has('a', {a: 1}) // => true R.has('b', {a: 1}) // => false ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/has.js) Try in REPL --- #### head > head(arrOrStr: T[]|string): T|string It returns the first element of `arrOrStr`. ``` R.head([1, 2, 3]) // => 1 R.head('foo') // => 'f' ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/head.js) Try in REPL --- #### identity > identity(x: T): T It just passes back the supplied arguments. ``` R.identity(7) // => 7 ``` --- #### ifElse > ifElse(condition: Function|boolean, ifFn: Function, elseFn: Function): Function It returns function, which expect `input` as argument and returns `finalResult`. When this function is called, a value `answer` is generated as a result of `condition(input)`. If `answer` is `true`, then `finalResult` is equal to `ifFn(input)`. If `answer` is `false`, then `finalResult` is equal to `elseFn(input)`. ``` const fn = R.ifElse( x => x > 10, x => x*2, x => x*10 ) const result = fn(8) // => 80 ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/ifElse.js) Try in REPL --- #### inc > inc(x: number): number It increments a number. ``` R.inc(1) // => 2 ``` --- #### includes > includes(x: any, arrOrStr: T[]|string): boolean ``` R.includes(1, [1, 2]) // => true R.includes('oo', 'foo') // => true R.includes('z', 'foo') // => false ``` !! Note that this method is not part of `Ramda` API. [Source](https://github.com/selfrefactor/rambda/tree/master/modules/includes.js) Try in REPL --- #### indexBy > indexBy(fn: Function, arr: T[]): Object It indexes array `arr` as an object with provided selector function `fn`. ``` R.indexBy( x => x.id, [ {id: 1}, {id: 2} ] ) // => { 1: {id: 1}, 2: {id: 2} } ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/indexBy.js) Try in REPL --- #### indexOf > indexOf(valueToFind: any, arr: T[]): number It returns `-1` or the index of the first element of `arr` equal of `valueToFind`. ``` R.indexOf(1, [1, 2]) // => 0 R.indexOf(0, [1, 2]) // => -1 ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/indexOf.js) Try in REPL --- #### init > init(arrOrStr: T[]|string): T[]|string - It returns all but the last element of `arrOrStr`. ``` R.init([1, 2, 3]) // => [1, 2] R.init('foo') // => 'fo' ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/init.js) Try in REPL --- #### join > join(separator: string, arr: T[]): string ``` R.join('-', [1, 2, 3]) // => '1-2-3' ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/join.js) Try in REPL --- #### is > is(xPrototype: any, x: any): boolean It returns `true` is `x` is instance of `xPrototype`. ``` R.is(String, 'foo') // => true R.is(Array, 1) // => false ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/is.js) Try in REPL --- #### isNil > isNil(x: any): boolean It returns `true` is `x` is either `null` or `undefined`. ``` R.isNil(null) // => true R.isNil(1) // => false ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/isNil.js) Try in REPL --- #### last > last(arrOrStr: T[]|string): T|string - It returns the last element of `arrOrStr`. ``` R.last(['foo', 'bar', 'baz']) // => 'baz' R.last('foo') // => 'o' ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/last.js) Try in REPL --- #### lastIndexOf > lastIndexOf(x: any, arr: T[]): number It returns the last index of `x` in array `arr`. `R.equals` is used to determine equality between `x` and members of `arr`. Value `-1` is returned if no `x` is found in `arr`. ``` R.lastIndexOf(1, [1, 2, 3, 1, 2]) // => 3 R.lastIndexOf(10, [1, 2, 3, 1, 2]) // => -1 ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/lastIndexOf.js) Try in REPL --- #### length > length(arrOrStr: Array|String): Number ``` R.length([1, 2, 3]) // => 3 ``` --- #### map > map(mapFn: Function, x: Array|Object): Array|Object It returns the result of looping through iterable `x` with `mapFn`. The method works with objects as well. Note that unlike Ramda's `map`, here object keys are passed as second argument to `mapFn`. ``` const mapFn = x => x * 2 const resultWithArray = R.map(mapFn, [1, 2, 3]) // => [2, 4, 6] const result = R.map((val, prop)=>{ return `${val}-${prop}` }, {a: 1, b: 2}) // => {a: 'a-1', b: 'b-2'} ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/map.js) Try in REPL --- #### match > match(regExpression: Regex, str: string): string[] ``` R.match(/([a-z]a)/g, 'bananas') // => ['ba', 'na', 'na'] ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/match.js) Try in REPL --- #### merge > merge(a: Object, b: Object) It returns result of `Object.assign({}, a, b)`. ``` R.merge({ 'foo': 0, 'bar': 1 }, { 'foo': 7 }) // => { 'foo': 7, 'bar': 1 } ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/merge.js) Try in REPL --- #### modulo > modulo(a: number, b: number):numberNumber It returns the remainder of operation `a/b`. ``` R.module(14, 3) // => 2 ``` --- #### multiply > multiply(a: number, b: number): number It returns the result of operation `a*b`. ``` R.multiply(4, 3) // => 12 ``` --- #### not > not(x: any): boolean It returns inverted boolean version of input `x`. ``` R.not(true) //=> false R.not(false) //=> true R.not(0) //=> true R.not(1) //=> false ``` --- #### omit > omit(propsToOmit: string[]|string, obj: Object): Object It returns a partial copy of an `obj` with omitting `propsToOmit` ``` R.omit('a,c,d', {a: 1, b: 2, c: 3}) // => {b: 2} ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/omit.js) Try in REPL --- #### path > path(pathToSearch: string[]|string, obj: Object): any If `pathToSearch` is `'a.b'` then it will return `1` if `obj` is `{a:{b:1}}`. It will return `undefined`, if such path is not found. ``` R.path('a.b', {a: {b: 1}}) // => 1 ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/path.js) Try in REPL --- #### pathOr > pathOr(defaultValue: any, pathToSearch: string[]|string, obj: Object): any `pathFound` is the result of calling `R.path(pathToSearch, obj)`. If `pathFound` is `undefined`, `null` or `NaN`, then `defaultValue` will be returned. `pathFound` is returned in any other case. ``` R.pathOr(1, 'a.b', {a: {b: 2}}) // => 2 R.pathOr(1, ['a', 'b'], {a: {b: 2}}) // => 2 R.pathOr(1, ['a', 'c'], {a: {b: 2}}) // => 1 ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/pathOr.js) Try in REPL --- #### partialCurry > partialCurry(fn: Function|Async, a: Object, b: Object): Function|Promise When called with function `fn` and first set of input `a`, it will return a function. This function will wait to be called with second set of input `b` and it will invoke `fn` with the merged object of `a` over `b`. `fn` can be asynchronous function. In that case a `Promise` holding the result of `fn` is returned. See the example below: ``` const fn = ({a, b, c}) => { return (a * b) + c } const curried = R.partialCurry(fn, {a: 2}) const result = curried({b: 3, c: 10}) // => 16 ``` - Note that `partialCurry` is method specific for **Rambda** and the method is not part of **Ramda**'s API - You can read my argumentation for creating *partialCurry* [here](https://selfrefactor.gitbooks.io/blog/content/argumenting-rambdas-curry.html) [Source](https://github.com/selfrefactor/rambda/tree/master/modules/partialCurry.js) Try in REPL --- #### pick > pick(propsToPick: string[], obj: Object): Object It returns a partial copy of an `obj` containing only `propsToPick` properties. ``` R.pick(['a', 'c'], {a: 1, b: 2}) // => {a: 1} ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/pick.js) Try in REPL --- #### pipe > pipe(fn1: Function, ... , fnN: Function): any It performs left-to-right function composition. ``` const result = R.pipe( R.filter(val => val > 2), R.map(a => a * 2) )([1, 2, 3, 4]) // => [6, 8] ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/pipe.js) Try in REPL --- #### pluck > pluck(property: string, arr: Object[]): any[] It returns list of the values of `property` taken from the objects in array of objects `arr`. ``` R.pluck('a')([{a: 1}, {a: 2}, {b: 3}]) // => [1, 2] ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/pluck.js) Try in REPL --- #### prepend > prepend(x: T, arr: T[]): T[] It adds `x` to the start of the array `arr`. ``` R.prepend('foo', ['bar', 'baz']) // => ['foo', 'bar', 'baz'] ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/prepend.js) Try in REPL --- #### prop > prop(propToFind: string, obj: Object): any It returns `undefined` or the value of property `propToFind` in `obj` ``` R.prop('x', {x: 100}) // => 100 R.prop('x', {a: 1}) // => undefined ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/prop.js) Try in REPL --- #### propEq > propEq(propToFind: string, valueToMatch: any, obj: Object): boolean It returns true if `obj` has property `propToFind` and its value is equal to `valueToMatch`. ``` const propToFind = 'foo' const valueToMatch = 0 const result = R.propEq(propToFind, valueToMatch)({foo: 0}) // => true ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/propEq.js) Try in REPL --- #### range > range(start: number, end: number): number[] It returns a array of numbers from `start`(inclusive) to `end`(exclusive). ``` R.range(0, 3) // => [0, 1, 2] ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/range.js) Try in REPL --- #### reduce > reduce(iteratorFn: Function, accumulator: any, array: T[]): any ``` const iteratorFn = (acc, val) => acc + val const result = R.reduce(iteratorFn, 1, [1, 2, 3]) // => 7 ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/reduce.js) Try in REPL --- #### reject > reject(fn: Function, arr: T[]): T[] It has the opposite effect of `R.filter`. It will return those members of `arr` that return `false` when applied to function `fn`. ``` const fn = x => x % 2 === 1 const result = R.reject(fn, [1, 2, 3, 4]) // => [2, 4] ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/reject.js) Try in REPL --- #### repeat > repeat(valueToRepeat: T, num: number): T[] ``` R.repeat('foo', 2) // => ['foo', 'foo'] ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/repeat.js) Try in REPL --- #### replace > replace(strOrRegex: string|Regex, replacer: string, str: string): string It replaces `strOrRegex` found in `str` with `replacer`. ``` R.replace('foo', 'bar', 'foo foo') // => 'bar foo' R.replace(/foo/, 'bar', 'foo foo') // => 'bar foo' R.replace(/foo/g, 'bar', 'foo foo') // => 'bar bar' ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/replace.js) Try in REPL --- #### reverse reverse(str: T[]): T[] ``` const arr = [1, 2] const result = R.reverse(arr) // => [2, 1] ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/reverse.js) Try in REPL --- #### sort takeLast(num: number, arrOrStr: T[]|string): T[]|String It returns copy of `arr` sorted by `sortFn`. Note that `sortFn` must return a number type. ``` const sortFn = (a, b) => a - b const result = R.sort(sortFn, [3, 1, 2]) // => [1, 2, 3] ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/sort.js) Try in REPL --- #### sortBy > sortBy(sortFn: Function, arr: T[]): T[] It returns copy of `arr` sorted by `sortFn`. `sortFn` must return value for comparison ``` const sortFn = obj => obj.foo const result = R.sortBy(sortFn, [ {foo: 1}, {foo: 0} ]) const expectedResult = [ {foo: 0}, {foo: 1} ] console.log(result === expectedResult) // => true ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/sortBy.js) Try in REPL --- #### split > split(separator: string, str: string): string[] ``` R.split('-', 'a-b-c') // => ['a', 'b', 'c'] ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/split.js) Try in REPL --- #### splitEvery > splitEvery(sliceLength: number, arrOrString: T[]|string): T[T[]]|string[] - It splits `arrOrStr` into slices of `sliceLength`. ``` R.splitEvery(2, [1, 2, 3]) // => [[1, 2], [3]] R.splitEvery(3, 'foobar') // => ['foo', 'bar'] ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/splitEvery.js) Try in REPL --- #### startsWith > startsWith(x: string, str: string): boolean ``` R.startsWith( 'foo', 'foo-bar' ) // => true R.startsWith( 'bar', 'foo-bar' ) // => false ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/startsWith.js) Try in REPL --- #### subtract > subtract(a: number, b: number): number ``` R.subtract(3, 1) // => 2 ``` --- #### T `R.T() // => true` --- #### tail > tail(arrOrStr: T[]|string): T[]|string - It returns all but the first element of `arrOrStr` ``` R.tail([1, 2, 3]) // => [2, 3] R.tail('foo') // => 'oo' ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/tail.js) Try in REPL --- #### take > take(num: number, arrOrStr: T[]|string): T[]|string - It returns the first `num` elements of `arrOrStr`. ``` R.take(1, ['foo', 'bar']) // => ['foo'] R.take(2, ['foo']) // => 'fo' ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/take.js) Try in REPL --- #### takeLast > takeLast(num: number, arrOrStr: T[]|string): T[]|string - It returns the last `num` elements of `arrOrStr`. ``` R.takeLast(1, ['foo', 'bar']) // => ['bar'] R.takeLast(2, ['foo']) // => 'oo' ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/takeLast.js) Try in REPL --- #### test > test(regExpression: Regex, str: string): boolean - Determines whether `str` matches `regExpression` ``` R.test(/^f/, 'foo') // => true ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/test.js) Try in REPL --- #### times > times(fn: Function, n: number): T[] It returns the result of applying function `fn` over members of range array. The range array includes numbers between `0` and `n`(exclusive). ``` R.times(R.identity, 5) //=> [0, 1, 2, 3, 4] ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/times.js) Try in REPL --- #### toLower > toLower(str: string): string ``` R.toLower('FOO') // => 'foo' ``` --- #### toString > toString(x: any): string ``` R.toString([1, 2]) // => '1,2' ``` --- #### toUpper > toUpper(str: string): string ``` R.toUpper('foo') // => 'FOO' ``` --- #### trim > trim(str: string): string ``` R.trim(' foo ') // => 'foo' ``` --- #### type > type(a: any): string ``` R.type(() => {}) // => 'Function' R.type(async () => {}) // => 'Async' R.type([]) // => 'Array' R.type({}) // => 'Object' R.type('foo') // => 'String' R.type(1) // => 'Number' R.type(true) // => 'Boolean' R.type(null) // => 'Null' R.type(/[A-z]/) // => 'RegExp' const delay = ms => new Promise(resolve => { setTimeout(function () { resolve() }, ms) }) R.type(delay) // => 'Promise' ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/type.js) Try in REPL --- #### uniq > uniq(arr: T[]): T[] It returns a new array containing only one copy of each element in `arr`. ``` R.uniq([1, 1, 2, 1]) // => [1, 2] ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/uniq.js) Try in REPL --- #### uniqWith > uniqWith(fn: Function, arr: T[]): T[] It returns a new array containing only one copy of each element in `arr` according to boolean returning function `fn`. ``` const arr = [ {id: 0, title:'foo'}, {id: 1, title:'bar'}, {id: 2, title:'baz'}, {id: 3, title:'foo'}, {id: 4, title:'bar'}, ] const expectedResult = [ {id: 0, title:'foo'}, {id: 1, title:'bar'}, {id: 2, title:'baz'}, ] const fn = (x,y) => x.title === y.title const result = R.uniqWith(fn, arr) console.log(result === expectedResult) // => true ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/uniqWith.js) Try in REPL --- #### update > update(i: number, replaceValue: T, arr: T[]): T[] It returns a new copy of the `arr` with the element at `i` index replaced with `replaceValue`. ``` R.update(0, 'foo', ['bar', 'baz']) // => ['foo', baz] ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/update.js) Try in REPL --- #### values > values(obj: Object): Array It returns array with of all values in `obj`. ``` R.values({a: 1, b: 2}) // => [1, 2] ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/values.js) Try in REPL --- #### without > without(a: T[], b: T[]): T[] It will return a new array based on `b` array. This array contains all members of `b` array, that doesn't exist in `a` array. Method `R.equals` is used to determine the existance of `b` members in `a` array. ``` R.without([1, 2], [1, 2, 3, 4]) // => [3, 4] ``` [Source](https://github.com/selfrefactor/rambda/tree/master/modules/without.js) Try in REPL --- #### zip > zip(a: K[], b: V[]): Array> It will return a new array containing tuples of equally positions items from both lists. The returned list will be truncated to match the length of the shortest supplied list. ``` R.zip([1, 2], ['A', 'B']) // => [[1, 'A'], [2, 'B']] // truncates to shortest list R.zip([1, 2, 3, 4], ['A', 'B']) // => [[1, 'A'], [2, 'B']] ``` ## Benchmark ![Screen](https://cdn.rawgit.com/selfrefactor/rambda/7475b559/files/screen1.png) ![Screen](https://cdn.rawgit.com/selfrefactor/rambda/7475b559/files/screen2.png) ## Tree-shaking ![bundlephobia](https://user-images.githubusercontent.com/2149294/30378716-c8e43568-989c-11e7-81ee-aa9ec2c4bff2.png) ## Use with ES5 ``` import omit from 'rambda/lib/omit' ``` ## Changelog - 1.1.1 Approve [PR #66](https://github.com/selfrefactor/rambda/pull/66) `R.zip` - 1.1.0 `R.compose` accepts more than one input argument [issue #65](https://github.com/selfrefactor/rambda/issues/65) - 1.0.13 Approve [PR #64](https://github.com/selfrefactor/rambda/pull/64) `R.indexOf` - 1.0.12 Close [issue #61](https://github.com/selfrefactor/rambda/issues/61) make all functions modules - 1.0.11 Close [issue #60](https://github.com/selfrefactor/rambda/issues/60) problem with babelrc - 1.0.10 Close [issue #59](https://github.com/selfrefactor/rambda/issues/59) add R.dissoc - 1.0.9 Close [issue #58](https://github.com/selfrefactor/rambda/issues/58) - Incorrect `R.equals` - 1.0.8 `R.map` and `R.filter` pass object properties when mapping over objects - 1.0.7 Add `R.uniqWith` - 1.0.6 Close [issue #52](https://github.com/selfrefactor/rambda/issues/52) - ES5 compatible code - 1.0.5 Close [issue #51](https://github.com/selfrefactor/rambda/issues/51) - 1.0.4 Close [issue #50](https://github.com/selfrefactor/rambda/issues/50) - add `R.pipe` typings - 1.0.3 `R.ifElse` accept also boolean as condition argument - 1.0.2 Remove `typedDefaultTo` and `typedPathOr` | Add `R.pickAll` and `R.none` - 1.0.0 Major change as build is now ES6 not ES5 compatible (Related to [issue #46](https://github.com/selfrefactor/rambda/issues/46))| Making `Rambda` fully tree-shakeable| Edit Typescript definition - 0.9.8 Revert to ES5 compatible build - [issue #46](https://github.com/selfrefactor/rambda/issues/46) - 0.9.7 Refactor for `Rollup` tree-shake | Remove `R.padEnd` and `R.padStart` - 0.9.6 Close [issue #44](https://github.com/selfrefactor/rambda/issues/44) - `R.reverse` mutates the array - 0.9.5 Close [issue #45](https://github.com/selfrefactor/rambda/issues/45) - invalid Typescript typings - 0.9.4 Add `R.reject` and `R.without` ([PR#41](https://github.com/selfrefactor/rambda/pull/41) [PR#42](https://github.com/selfrefactor/rambda/pull/42)) | Remove 'browser' field in `package.json` due to Webpack bug [4674](https://github.com/webpack/webpack/issues/4674) - 0.9.3 Add `R.forEach` and `R.times` - 0.9.2 Add `Typescript` definitions - 0.9.1 Close [issue #36](https://github.com/selfrefactor/rambda/issues/36) - move current behaviour of `defaultTo` to a new method `typedDefaultTo`; make `defaultTo` follow Ramda spec; add `pathOr`; add `typedPathOr`. - 0.9.0 Add `R.pipe` [PR#35](https://github.com/selfrefactor/rambda/pull/35) - 0.8.9 Add `R.isNil` - 0.8.8 Migrate to ES modules [PR33](https://github.com/selfrefactor/rambda/pull/33) | Add R.flip to the API | R.map/filter works with objects - 0.8.7 Change `Webpack` with `Rollup` - [PR29](https://github.com/selfrefactor/rambda/pull/29) - 0.8.6 Add `R.tap` and `R.identity` - 0.8.5 Add `R.all`, `R.allPass`, `R.both`, `R.either` and `R.complement` - 0.8.4 Learning to run `yarn test` before `yarn publish` the hard way - 0.8.3 Add `R.always`, `R.T` and `R.F` - 0.8.2 Add `concat`, `padStart`, `padEnd`, `lastIndexOf`, `toString`, `reverse`, `endsWith` and `startsWith` methods - 0.8.1 Add `R.ifElse` - 0.8.0 Add `R.not`, `R.includes` | Take string as condition for `R.pick` and `R.omit` - 0.7.6 Fix incorrect implementation of `R.values` - 0.7.5 Fix incorrect implementation of `R.omit` - 0.7.4 [issue #13](https://github.com/selfrefactor/rambda/issues/13) - Fix `R.curry`, which used to return incorrectly `function` when called with more arguments - 0.7.3 Close [issue #9](https://github.com/selfrefactor/rambda/issues/9) - Compile to `es2015`; Approve [PR #10](https://github.com/selfrefactor/rambda/pull/10) - add `R.addIndex` to the API - 0.7.2 Add `Promise` support for `R.type` - 0.7.1 Close [issue #7](https://github.com/selfrefactor/rambda/issues/7) - add `R.reduce` to the API - 0.7.0 Close [issue #5](https://github.com/selfrefactor/rambda/issues/5) - change name of `curry` to `partialCurry`; add new method `curry`, which works just like Ramda's `curry` - 0.6.2 Add separate documentation site via `docsify` ## Browse by category ### Function [addIndex](#addindex) [always](#always) [compose](#compose) [curry](#curry) [F](#f) [flip](#flip) [identity](#identity) [pipe](#pipe) [T](#t) [tap](#tap) ### Math [add](#add) [dec](#dec) [divide](#divide) [inc](#inc) [modulo](#modulo) [multiply](#multiply) [subtract](#subtract) ### List [adjust](#adjust) [all](#all) [any](#any) [append](#append) [concat](#concat) [contains](#contains) [drop](#drop) [dropLast](#droplast) [endsWith](#endswith) [filter](#filter) [find](#find) [findIndex](#findindex) [flatten](#flatten) [forEach](#foreach) [head](#head) [indexOf](#indexof) [init](#init) [join](#join) [last](#last) [lastIndexOf](#lastindexof) [length](#length) [map](#map) [none](#none) [pluck](#pluck) [prepend](#prepend) [range](#range) [reduce](#reduce) [reject](#reject) [repeat](#repeat) [reverse](#reverse) [sort](#sort) [splitEvery](#splitevery) [startsWith](#startswith) [tail](#tail) [take](#take) [takeLast](#takelast) [times](#times) [uniq](#uniq) [uniqWith](#uniqwith) [update](#update) [without](#without) ### Logic [allPass](#allpass) [anyPass](#anypass) [both](#both) [complement](#complement) [defaultTo](#defaultto) [either](#either) [ifElse](#ifelse) [not](#not) ### Object [dissoc](#dissoc) [has](#has) [merge](#merge) [omit](#omit) [path](#path) [pathOr](#pathor) [pick](#pick) [pickAll](#pickall) [prop](#prop) [values](#values) ### Relation [equals](#equals) [propEq](#propeq) [sortBy](#sortby) ### Type [is](#is) [isNil](#isnil) [type](#type) ### String [match](#match) [replace](#replace) [split](#split) [test](#test) [toLower](#tolower) [toString](#tostring) [toUpper](#toupper) [trim](#trim) ## Additional info > Running benchmarks - To run all benchmarks `yarn run benchmark all` - To run single or number of benchmarks `yarn run benchmark add compose filter` > Projects using Rambda - [string-fn](https://github.com/selfrefactor/string-fn) - [tachyons-for-js](https://github.com/devilcoders/tachyons-for-js) - [react-append-to-body](https://github.com/jpgorman/react-append-to-body) - [docker-voting-app-nodejs](https://github.com/subfuzion/docker-voting-app-nodejs) - [ig-api](https://www.npmjs.com/package/ig-api) - [ldap-authenticate](https://www.npmjs.com/package/ldap-authenticate) - [mat-che](https://github.com/ianagbip1oti/mat-che) > Articles about Rambda - [Interview with Dejan Totef at SurviveJS blog](https://survivejs.com/blog/rambda-interview/) - [Argumentation of Rambda's curry method](https://selfrefactor.gitbooks.io/blog/content/argumenting-rambdas-curry.html)