@hs/transmute

@hs/transmute provides convenient, composable functions for transforming Arrays, Immutable.js data structures, and Objects.
Getting started
Transmute can be installed with npm or yarn.
npm install @hs/transmute
import { Map } from 'immutable';
import pick from 'transmute/pick';
pick(['one', 'three'], Map({one: 1, two: 2, three: 3}));
Most of the function (with the execption of some of the composition functions like compose and pipe) are curried to facilitate partial application. You might also notice that the argument order is the oposite of you'll find in other utility libraries. Passing the options and then the subject makes currying much more useful.
import { Map } from 'immutable';
import pick from 'transmute/pick';
const pickTwo = pick(['two']);
pickTwo(Map({one: 1, two: 2, three: 3}));
transmute also includes some helpful composition functions which are powerful when we combine them with curried transforms.
import { Map, Set } from 'immutable';
import * as t from 'transmute';
const setOfKeysWithEvenValues = t.pipe(
t.filter((val) => val % 2 === 0),
t.keySeq,
Set
);
takeEvenValues(Map({one: 1, two: 2, three: 3, four: 4}));
API
always
src/always.js:13-15
Creates a function that always returns returnValue.
Parameters
Examples
const alwaysBlue = always('blue');
alwaysBlue() === 'blue';
Returns T
bind
src/bind.js:18-18
Sets a function's this context. Similar to Function.prototype.bind.
Parameters
Examples
bind(console.log, console);
Returns Function
both
src/both.js:29-29
Returns true if the results of arg applied to both condition1 and
condition2 are truthy.
Parameters
Examples
const isOneToTen = both(
n => n >= 1,
n => n <= 10
);
isOneToTen(3) === true;
isOneToTen(11) === false;
Returns boolean
clear
src/clear.js:14-14
Returns an empty copy of subject.
Parameters
Examples
clear([1, 2, 3])
clear(List.of(1, 2, 3))
clear({one: 1, two: 2, three: 3})
Returns (Array | Collection | Object)
compose
src/compose.js:28-31
Create a function that runs operations from right-to-left.
compose is not curried.
Parameters
Examples
const doubleAndTakeEvens = pipe(
filter(n => n % 2 === 0),
map(n => n * 2)
);
doubleAndTakeEvens(List.of(1, 2, 3))
Returns Function
concat
src/concat.js:18-18
Joins two Iterable.Indexed objects together.
Examples
concat(List([3]), List([1, 2]));
const addY = concat(List(['y']);
addY(List(['x']));
Returns Iterable with the concatenated value. Does not support keyed Iterable subjects.
count
src/count.js:12-12
Returns the number of values in subject.
Parameters
Examples
count(List.of(1, 2, 3)) === 3;
Returns number
curry
src/curry.js:14-16
Creates a curried version of operation.
Parameters
Examples
const toArray = curry((a, b, c) => [a, b, c]);
const toArrayWith1 = toArray(1);
toArrayWith1(2, 3) === [1, 2, 3];
Returns Function
curryN
src/curryN.js:41-41
Create a curried version of operation that expects arity arguments.
Inception-ally, curryN is also curried.
Parameters
arity number number of arguments the curried function accepts
operation Function to curry
Examples
const toArray = curryN(3)((...args) => [...args]);
toArray(1, 2, 3) === [1, 2, 3];
Returns Function
debounce
src/debounce.js:42-42
operation is called interval milliseconds after the most recent call.
Parameters
Returns any the most recent result of operation
debounceImmediate
src/debounceImmediate.js:52-52
operation is called immediately and then interval milliseconds after the most
recent call.
Parameters
Returns any the most recent result of operation
difference
src/difference.js:24-24
Take the difference between one iterable and another iterable.
Only the elements present in just subject will remain.
Parameters
toRemove Iterable
subject Iterable
Examples
const removeOne = difference(Set.of(1));
removeOne(Set.of(1, 2, 3))
Returns Iterable
either
src/either.js:26-26
Returns true if the results of arg applied to either first or second
are truthy.
Parameters
Examples
const oneOrTwo = either(
n => n === 1,
n => n === 2
);
oneOrTwo(1) === true;
oneOrTwo(2) === true;
oneOrTwo(3) === false;
Returns boolean
entrySeq
src/entrySeq.js:13-13
Get a Seq of the entries (i.e. [key, value] tuples) in subject.
Parameters
Examples
entrySeq(Map({one: 1, two: 2}))
Returns Seq
every
src/every.js:17-17
Returns true if all items in subject match predicate.
Parameters
predicate Function returns true if item is a match.
subject Iterable
Examples
const alwaysBlue = every(v => v === 'blue');
alwaysBlue(List.of('blue', 'blue')) === true;
alwaysBlue(List.of('red', 'blue')) === false;
Returns bool
filter
src/filter.js:25-25
Remove values for which predicate returns false.
Parameters
predicate Function returns true if a value should be included.
subject Iterable to filter.
Examples
filter(
(n) => n % 2 === 0,
List.of(1, 2, 3)
);
Records have a fixed set of keys, so filter returns a Map instead.
filter(
(n) => n % 2 === 0,
ThreeRecord({one: 1, two: 2, three: 3})
);
Returns Iterable without values that didn't match predicate.
filterNot
src/filterNot.js:22-22
Remove values for which predicate returns true.
Parameters
predicate Function returns true if a value should be excluded.
subject Iterable to filter.
Examples
filterNot(
(n) => n % 2 === 0,
List.of(1, 2, 3)
);
Returns Iterable without values that matched predicate.
flatten
src/flatten.js:13-15
Flattens an iterable as deeply as possible.
Parameters
Examples
flatten(List.of(List.of(1, List.of(2, 3)), List.of(4, 5, 6)));
Returns Iterable
flattenN
src/flattenN.js:16-16
Flattens an iterable depth levels.
Parameters
Examples
flattenN(1, List.of(List.of(1, List.of(2, 3)), List.of(4, 5, 6)));
Returns Iterable
forEach
src/forEach.js:22-22
Executes effect for each value in subject, then returns subject.
Parameters
Examples
forEach(
v => console.log(v),
Map({ one: 1, two: 2, three: 3 })
);
Returns TYPE
fromJS
src/fromJS.js:15-17
A version of Immutable.fromJS that drops all but the first argument for
compatibility with other transmute functions like map.
Parameters
Examples
fromJS({items: [1, 2, 3]})
Returns Iterable?
get
src/get.js:15-15
Retrieve the value at key from subject.
Parameters
key any to lookup in subject.
subject (Iterable | Object) in which to look up key.
Examples
get('one', Map({one: 1, two: 2, three: 3}))
Returns any the value at key.
getIn
src/getIn.js:23-23
Retrieve a keyPath from a nested Immutable or JS structure.
getIn short circuts when it encounters a null or undefined value.
Parameters
Examples
const getFirstName = getIn(['name', 'first']);
const user = UserRecord({
name: Map({
first: 'Test',
last: 'Testerson',
}),
});
getFirstName(user) === 'Test'
Returns any
has
src/has.js:17-17
Returns true if key exists in subject.
Parameters
Examples
const hasOne = has('one');
hasOne({one: 1}) === true;
hasOne(Map({two: 2})) === false;
Returns boolean
hasIn
src/hasIn.js:41-41
Returns true if keyPath is defined in a nested data structure.
hasIn short circuts and returns false when it encounters a null or undefined value.
Parameters
Examples
const hasFirstName = hasIn(['name', 'first']);
const user = UserRecord({
name: Map({
first: 'Test',
last: 'Testerson',
}),
});
hasFirstName(user) === true
Returns boolean
identity
src/identity.js:12-14
Returns it's first argument.
Parameters
Examples
identity('something') === 'something'
Returns any
ifElse
src/ifElse.js:31-31
Applies affirmative to subject if predicate(subject) is truthy.
Otherwise applies negative to subject.
Parameters
Examples
const incrementAwayFromZero = ifElse(
n => n >= 0,
n => n + 1,
n => n - 1
);
incrementAwayFromZero(1) === 2
incrementAwayFromZero(-1) === -2
Returns any
ifThen
src/ifThen.js:32-32
Applies affirmative to subject if predicate(subject) is truthy.
Otherwise returns subject.
Parameters
Examples
import ifThen from 'transmute/ifThen';
const toJS = ifThen(
subject => typeof subject.toJS === 'function',
subject => subject.toJS
);
toJS(List.of(1, 2, 3))
toJS([1, 2, 3])
Returns any
indexBy
src/indexBy.js:27-27
Create a Map, or OrderedMap from subject with a key for each item
returned by keyMapper.
Parameters
keyMapper Function generates keys for each item
subject Iterable to index
Examples
indexBy(get('id'), List.of({id: 123}, {id: 456}))
Returns KeyedIterable
keySeq
src/keySeq.js:13-13
Get a Seq of the keys in subject.
Parameters
Examples
keySeq({one: 1, two: 2, three: 3})
Returns Seq
map
src/map.js:18-18
Create a new Iterable by applying mapper to each item in subject.
Parameters
mapper Function applied to each item in subject.
subject Iterable the Iterable to map.
Examples
map(
(val) => val + 1,
List.of(1, 2, 3)
);
Returns Iterable with each value of subject updated with mapper.
reduce
src/reduce.js:21-21
Transform the contents of subject to into by applying operation to each
item.
Parameters
into any
operation Function
subject Iterable [description]
Examples
reduce(
List(),
(acc, val) => acc.push(val),
Map({ one: 1, two: 2, three: 3 })
);
Returns Iterable
set
src/set.js:16-16
Returns a copy of subject with key set to value.
Parameters
Examples
set('one', 2, {one: 1});
Returns (Array | Iterable | Object)
some
src/some.js:17-17
Returns true if any items in subject match predicate.
Parameters
predicate Function returns true if item is a match.
subject Iterable
Examples
const anyBlue = some(v => v === 'blue');
anyBlue(List.of('blue', 'red')) === true;
anyBlue(List.of('red', 'red')) === true;
Returns bool
sortBy
src/sortBy.js:25-25
Sort subject according to the value returned by getSortValue.
Parameters
getSortValue Function returns a value to sort on for each item in subject.
subject (Array | Iterable | Object) the thing to sort.
Examples
sortBy(
(n) => n % 2,
List.of(1, 2, 3)
);
sortBy(
(n) => n % 2,
Map({three: 3, one: 1, two: 2})
);
Returns Iterable an ordered version of subject (e.g. sorting a Map returns an OrderedMap).
valueSeq
src/valueSeq.js:13-13
Get a Seq of the values in subject.
Parameters
Examples
valueSeq(Map({ one: 1, two: 2, three: 3 }))
Returns Seq
isArray
src/isArray.js:9-11
Returns true if value is an Array.
Parameters
Returns boolean
isEmpty
src/isEmpty.js:11-16
Returns true if value is "empty".
If given null, undefined, isEmpty will return true.
Parameters
Returns boolean
isFunction
src/isFunction.js:9-11
Returns true if value is a Function.
Parameters
Returns boolean
isInstanceOf
src/isInstanceOf.js:14-14
Returns true if value is an instance of Constructor.
Parameters
Returns boolean
isNull
src/isNull.js:9-11
Returns true if subject is null.
Parameters
Returns boolean
isNumber
src/isNumber.js:9-11
Returns true if subject is a JavaScript Number and not NaN.
Parameters
Returns boolean
isObject
src/isObject.js:9-11
Returns true if value is an Object.
Parameters
Returns boolean
isRecord
src/isRecord.js:10-14
Returns true if subject is an instance of a Record.
Parameters
Returns boolean
isString
src/isString.js:9-11
Returns true if value is a String.
Parameters
Returns boolean
isUndefined
src/isUndefined.js:9-11
Returns true if subject is undefined.
Parameters
Returns boolean
mapKeys
src/mapKeys.js:37-37
Like map but transforms an Iterable's keys rather than its values.
Parameters
keyMapper Function returns a new key
subject KeyedIterable
Examples
Can be useful for converting keys of API results to a common type.
import { mapKeys, toString } from 'transmute';
const stringifyKeys = mapKeys(toString);
const m = Map.of(123, Map(), 456, Map(), 789, Map());
stringifyKeys(m).equals(Map.of('123', Map(), '456', Map(), '789', Map()));
Returns KeyedIterable
match
src/match.js:25-25
Returns true if the key => value pairs in pattern match the correspoding key => value pairs in subject.
Parameters
Examples
const hasOneAndThree = match({one: 1, three: 3});
hasOneAndThree(Map({one: 1, two: 2, three: 3})) === true;
Returns boolean
memoize
src/memoize.js:54-61
Memoizer that uses a Map to allow for arbitrarily many/complex keys.
Parameters
operation Function to memoize.
hashFunction Function that generates the cache key. (optional, default defaultHashFunction)
Examples
const sum = memoize((list) => {
return list.reduce((total, n) => total + n, 0);
});
sum(List.of(1, 2, 3, 4, 5))
sum(List.of(1, 2, 3, 4, 5))
We can use the hashFunction param to customize the key used in the cache.
const sum = memoize(
(list) => list.reduce((total, n) => total + n, 0),
(list) => return list.join('-')
);
It's also possible to inspect the state of an instance by reading the .cache property.
const sum = memoize(...);
Map.isMap(sum.cache) === true;
Returns Function memoized version of operation.
memoizeLast
src/memoizeLast.js:21-44
Like memoize, but only caches the most recent value.
It's often useful for caching expensive calculations in react components.
Parameters
Examples
const sum = memoizeLast((...nums) => nums.reduce((acc, n) => acc + n));
sum(List.of(1, 2, 3))
sum(List.of(1, 2, 3))
sum(List.of(4, 5, 6))
sum(List.of(1, 2, 3))
Returns Function
merge
src/merge.js:23-23
Takes each entry of updates and sets it on subject.
Parameters
updates Iterable key-value pairs to merge in subject.
subject Iterable the thing to update.
Examples
merge(
Map({one: 1, two: 2, three: 3}),
Map({one: 3, three: 1})
);
Returns Iterable with each key-value of updates merged into subject.
omit
src/omit.js:24-24
Drop specified keys from a KeyedIterable (e.g. a Map or OrderedMap).
Parameters
keys Array<any> to remove.
subject KeyedIterable from which to remove keys.
Examples
omit(
['one', 'three'],
Map({one: 1, two: 2, three: 3})
);
Returns KeyedIterable without keys.
once
src/once.js:7-17
fn is only run one time.
Parameters
Returns any the result of the first time fn was called
partial
src/partial.js:17-20
Like fn.bind(), but without the option to pass context.
partial is not curried.
const add = (a, b, c) => a + b + c;
const add11 = partial(add, 5, 6);
add11(7); // returns 18
Parameters
operation Function the function to bind.
first any the first argument to pass to operation
args ...any
Returns Function
partialApply
src/partialApply.js:34-34
Like transmute/partial, but takes an Array or Iterable of arguments to pass
to operation rather than a dynamic number of args. Unlike partial it is
curried.
partial : partialApply :: Function.prototype.call : Function.prototype.apply
Parameters
operation Function the function to bind.
args (Array | Iterable) ordered collection of arguments to bind to fn.
Examples
const add = (a, b, c) => a + b + c;
const add11 = partialApply(add, [5, 6]);
add11(7);
Returns Function
pick
src/pick.js:24-24
Select specified keys from a KeyedIterable (e.g. a Map or OrderedMap).
Parameters
keys (Array | Iterable | Object) to select.
subject KeyedIterable from which to select keys.
Examples
pick(
['one', 'three'],
Map({one: 1, two: 2, three: 3})
);
Returns KeyedIterable with just keys.
pipe
src/pipe.js:28-31
Create a function that runs operations from left-to-right.
pipe is not curried.
Parameters
Examples
const takeEvensAndDouble = pipe(
filter(n => n % 2 === 0),
map(n => n * 2)
);
takeEvensAndDouble(List.of(1, 2, 3))
Returns Function
pluck
src/pluck.js:20-20
Select key from each item in subject.
Parameters
Examples
const pluckName = pluck('name');
pluckName(userMap) === Map({123: 'Testing'});
Returns Iterable
setArity
src/setArity.js:18-18
Creates a function identical to operation but with length arity.
Parameters
Examples
const op = (...args) => args;
op.length === 0;
const twoArgOp = setArity(2, op);
twoArgOp.length === 2;
Returns Function
setIn
src/setIn.js:23-23
Set the value at keyPath in a nested structure.
Parameters
keyPath (Array<any> | Iterable<any>)
value any
subject (Array | Iterable | Object)
Examples
setIn(['one', 'two'], 3, {one: {two: 2}});
Unset keyPaths will be set based on the most recent type.
setIn(['one', 'two'], 3, {});
setIn(['one', 'two'], 3, Map());
throttle
src/throttle.js:47-47
Ensures operation is only called once every interval milliseconds.
Parameters
Returns any the most recent result of operation
toJS
src/toJS.js:7-18
Converts an Iterable to a native JS structure.
Parameters
subject Iterable to convert.
Returns (Array | Object) native JS requivalent of subject.
toSeq
src/toSeq.js:11-15
Converts subject to a Seq if possible.
Parameters
Returns Seq
toString
src/toString.js:6-8
Returns the value converted to a string.
Parameters
uniqueId
src/uniqueId.js:12-14
Returns a unique integer string appended to prefix.
Parameters
prefix string (optional, default '')
Examples
uniqueId('test-') === 'test-1';
uniqueId('other-') === 'other-2';
uniqueId('test-') === 'test-3';
update
src/update.js:23-23
Sets the value at key to the result of updater.
Parameters
Examples
const incrementCount = update('count', n => n + 1);
incrementCount({count: 1});
Returns (Array | Iterable | Object)
updateIn
src/updateIn.js:31-31
Apply updater to the value at keyPath.
Parameters
keyPath (Array<any> | Iterable<any>) the location where updater should be applied.
updater Function the tranformation to apply.
subject (Array | Iterable | Object) the thing to update.
Examples
const incrementUserCount = updateIn(['users', 'count'], n => n + 1);
incrementUserCount({users: {count: 1}});
Unset keyPaths will be set based on the most recent type.
const incrementUserCount = updateIn(['users', 'count'], (n = 0) => n + 1);
incrementUserCount({});
incrementUserCount(Map());
Returns (Array | Iterable | Object)
where
src/where.js:25-25
Takes items in subject that match pattern.
Parameters
Examples
const users = Map({
123: {id: '123', name: 'Jack'},
456: {id: '456', name: 'Jill'},
});
where({name: 'Jack'}, users);
Returns Iterable
without
src/without.js:23-23
Removes values in unwanted from subject.
Parameters
unwanted Iterable
subject Iterable
Examples
const removeOne = without(Set.of(1));
removeOne(Set.of(1, 2, 3))
Returns Iterable