medley.core

A small collection of useful, mostly pure functions that might not look out of place in the clojure.core namespace.

abs

(abs x)

Returns the absolute value of a number.

assoc-some

(assoc-some m k v)(assoc-some m k v & kvs)

Associates a key k, with a value v in a map m, if and only if v is not nil.

boolean?

(boolean? x)

Returns true if x is a boolean.

dedupe-by

(dedupe-by f)(dedupe-by f coll)

Returns a lazy sequence of the elements of coll, removing any consecutive elements that return duplicate values when passed to a function f. Returns a transducer when no collection is provided.

deep-merge

added in 1.1.0

(deep-merge & maps)

Recursively merges maps together. If all the maps supplied have nested maps under the same keys, these nested maps are merged. Otherwise the value is overwritten, as in clojure.core/merge.

deref-reset!

(deref-reset! atom newval)

Sets the value of the atom without regard for the current value, then returns the original value of the atom. See also: deref-swap!.

deref-swap!

(deref-swap! atom f & args)

Atomically swaps the value of the atom to be (apply f x args), where x is the current value of the atom, then returns the original value of the atom. This function therefore acts like an atomic deref then swap!.

dissoc-in

(dissoc-in m ks)(dissoc-in m ks & kss)

Dissociate a value in a nested associative structure, identified by a sequence of keys. Any collections left empty by the operation will be dissociated from their containing structures.

distinct-by

(distinct-by f)(distinct-by f coll)

Returns a lazy sequence of the elements of coll, removing any elements that return duplicate values when passed to a function f. Returns a transducer when no collection is provided.

drop-upto

(drop-upto pred)(drop-upto pred coll)

Returns a lazy sequence of the items in coll starting after the first item for which (pred item) returns true. Returns a transducer when no collection is provided.

ex-cause

(ex-cause ex)

Returns the cause attached to the given ExceptionInfo/Throwable object. For all other types returns nil. Same as cljs.core/ex-cause except it works for Clojure as well as ClojureScript.

ex-message

(ex-message ex)

Returns the message attached to the given Error/Throwable object. For all other types returns nil. Same as cljs.core/ex-message except it works for Clojure as well as ClojureScript.

filter-keys

(filter-keys pred coll)

Returns a new associative collection of the items in coll for which (pred (key item)) returns true.

filter-kv

(filter-kv pred coll)

Returns a new associative collection of the items in coll for which (pred (key item) (val item)) returns true.

filter-vals

(filter-vals pred coll)

Returns a new associative collection of the items in coll for which (pred (val item)) returns true.

find-first

(find-first pred)(find-first pred coll)

Finds the first item in a collection that matches a predicate. Returns a transducer when no collection is provided.

greatest

(greatest & xs)

Find the greatest argument (as defined by the compare function) in O(n) time.

greatest-by

added in 1.6.0

(greatest-by keyfn & xs)

Return the argument for which (keyfn x) is greatest. Determined by the compare function in O(n) time. Prefer clojure.core/max-key if keyfn returns numbers.

index-by

added in 1.2.0

(index-by f coll)

Returns a map of the elements of coll keyed by the result of f on each element. The value at each key will be the last element in coll associated with that key. This function is similar to clojure.core/group-by, except that elements with the same key are overwritten, rather than added to a vector of values.

indexed

(indexed)(indexed coll)

Returns an ordered, lazy sequence of vectors [index item], where item is a value in coll, and index its position starting from zero. Returns a transducer when no collection is provided.

insert-nth

added in 1.2.0

(insert-nth index item)(insert-nth index item coll)

Returns a lazy sequence of the items in coll, with a new item inserted at the supplied index, followed by all subsequent items of the collection. Runs in O(n) time. Returns a transducer when no collection is provided.

interleave-all

(interleave-all & colls)

Returns a lazy seq of the first item in each coll, then the second, etc. Unlike clojure.core/interleave, the returned seq contains all items in the supplied collections, even if the collections are different sizes.

join

added in 1.1.0

(join colls)

Lazily concatenates a collection of collections into a flat sequence.

least

(least & xs)

Return the least argument (as defined by the compare function) in O(n) time.

least-by

added in 1.6.0

(least-by keyfn & xs)

Return the argument for which (keyfn x) is least. Determined by the compare function in O(n) time. Prefer clojure.core/min-key if keyfn returns numbers.

map-entry

(map-entry k v)

Create a map entry for a key and value pair.

map-keys

(map-keys f coll)

Maps a function over the keys of an associative collection.

map-kv

(map-kv f coll)

Maps a function over the key/value pairs of an associative collection. Expects a function that takes two arguments, the key and value, and returns the new key and value as a collection of two elements.

map-kv-keys

added in 1.2.0

(map-kv-keys f coll)

Maps a function over the key/value pairs of an associative collection, using the return of the function as the new key.

map-kv-vals

added in 1.2.0

(map-kv-vals f coll)

Maps a function over the key/value pairs of an associative collection, using the return of the function as the new value.

map-vals

(map-vals f coll)(map-vals f c1 & colls)

Maps a function over the values of one or more associative collections. The function should accept number-of-colls arguments. Any keys which are not shared among all collections are ignored.

mapply

(mapply f & args)

Applies a function f to the argument list formed by concatenating everything but the last element of args with the last element of args. This is useful for applying a function that accepts keyword arguments to a map.

partition-after

added in 1.5.0

(partition-after pred)(partition-after pred coll)

Returns a lazy sequence of partitions, splitting after (pred item) returns true. Returns a transducer when no collection is provided.

partition-before

added in 1.5.0

(partition-before pred)(partition-before pred coll)

Returns a lazy sequence of partitions, splitting before (pred item) returns true. Returns a transducer when no collection is provided.

partition-between

added in 1.7.0

(partition-between pred)(partition-between pred coll)

Applies pred to successive values in coll, splitting it each time (pred prev-item item) returns logical true. Returns a lazy seq of partitions. Returns a stateful transducer when no collection is provided.

queue

(queue)(queue coll)

Creates an empty persistent queue, or one populated with a collection.

queue?

(queue? x)

Returns true if x implements clojure.lang.PersistentQueue.

random-uuid

(random-uuid)

Generates a new random UUID. Same as cljs.core/random-uuid except it works for Clojure as well as ClojureScript.

regexp?

added in 1.4.0

(regexp? x)

Returns true if the value is a regular expression.

remove-keys

(remove-keys pred coll)

Returns a new associative collection of the items in coll for which (pred (key item)) returns false.

remove-kv

(remove-kv pred coll)

Returns a new associative collection of the items in coll for which (pred (key item) (val item)) returns false.

remove-nth

added in 1.2.0

(remove-nth index)(remove-nth index coll)

Returns a lazy sequence of the items in coll, except for the item at the supplied index. Runs in O(n) time. Returns a transducer when no collection is provided.

remove-vals

(remove-vals pred coll)

Returns a new associative collection of the items in coll for which (pred (val item)) returns false.

replace-nth

added in 1.2.0

(replace-nth index item)(replace-nth index item coll)

Returns a lazy sequence of the items in coll, with a new item replacing the item at the supplied index. Runs in O(n) time. Returns a transducer when no collection is provided.

take-upto

(take-upto pred)(take-upto pred coll)

Returns a lazy sequence of successive items from coll up to and including the first item for which (pred item) returns true. Returns a transducer when no collection is provided.

update-existing

added in 1.1.0

(update-existing m k f & args)

Updates a value in a map given a key and a function, if and only if the key exists in the map. See: clojure.core/update.

update-existing-in

added in 1.3.0

(update-existing-in m ks f & args)

Updates a value in a nested associative structure, if and only if the key path exists. See: clojure.core/update-in.

uuid

(uuid s)

Returns a UUID generated from the supplied string. Same as cljs.core/uuid in ClojureScript, while in Clojure it returns a java.util.UUID object.

uuid?

(uuid? x)

Returns true if the value is a UUID.