taoensso.encore
Extended core library for Clojure/Script that emphasizes:
* Cross-platform API
* Flexibility
* Performance
* Backwards compatibility
This lib's mostly for my own use and for advanced users that feel
comfortable reading this source. Not providing much beginner-oriented
documentation for this, sorry.
Common naming conventions used across my libs:
**foo** - Dynamic var
foo! - Fn with side-effects, or that should otherwise be used cautiously
foo? - Truthy val or fn that returns truthy val
foo!? - Fn that has side-effects (or requires caution) and that return
a truthy val. Note: !?, not ?!
foo$ - Fn that's notably expensive to compute (e.g. hits db)
foo_ - Derefable val (e.g. atom, volatile, delay, etc.)
foo__ - Derefable in a derefable (e.g. delay in an atom), etc.
_ - Unnamed val
_foo - Named but unused val
?foo - Optional val (emphasize that val may be nil)
foo* - A variation of `foo` (e.g. `foo*` macro vs `foo` fn)
foo' - ''
-foo - Public implementation detail or intermediate (e.g. uncoerced) val
>foo - Val "to foo" (e.g. >sender, >host), or fn to put/coerce/transform
<foo - Val "from foo" (e.g. <sender, <host), or fn to take/coerce/transform
->foo - Fn to put/coerce/transform
Type affixes may be used for clarity:
<prefix>-<name> - m-users, v-users, n-users, etc. (also nusers when unambiguous)
<name>-<postfix> - users-map, users-vec, user-count, etc.
Regarding name heirarchy:
When there's a significant num of syms with a meaningful hierarchy,
prefer names with descending hierarchy to emphasize structure and
related groups/functionality, e.g.:
`user-add`, `user-remove`, `user-mod` vs
`add-user`, `remove-user`, `mod-user`, etc.
Commit message tags (in priority order):
[wip] - Work-in-progress (still under development)
[mod] - Modify behaviour (=> breaking), [mod!], [mod!!], etc. for attention
[fix] - Fix broken behaviour (=> usu. non-breaking)
[new] - Add new behaviour (=> non-breaking)
[doc] - Documentation changes besides those better labelled as [mod], [fix], or [new]
[nop] - Other non-breaking changes (to implementation details, non-code changes, etc.)
[x] [y] - Single commit with multiple tags (in priority order), try avoid
Example commit messages:
v1.0.0 (2022-01-27) ; Tagged release
[new] [#122] Add new feature x (@contributor)
Version numbers:
Ver tables: X.Y.Z (without backticks)
Min ver: vX.Y.Z+
Elsewhere: vX.Y.Z
-cond
macro
clj
(-cond throw? & clauses)
a-utf8-str
clj
Example UTF-8 string for tests, etc.
abbreviate-ns
clj
added in Encore v3.68.0 (2023-09-25)
(abbreviate-ns x)
(abbreviate-ns n-full x)
Give any nameable type (string, keyword, symbol), returns the same
type with at most `n-full` (default 1) unabbreviated namespace parts.
Example:
(abbreviate-ns 0 :foo.bar/baz) => :f.b/baz
(abbreviate-ns 1 'foo.bar/baz) => 'f.bar/baz
(abbreviate-ns 2 "foo.bar/baz") => "foo.bar/baz"
after-timeout
macro
clj
(after-timeout msecs & body)
Alpha, subject to change.
Returns a TimeoutFuture that will execute body after timeout.
Body must be non-blocking or cheap.
approx==
clj
(approx== x y)
(approx== signf x y)
as-?dt
clj
added in Encore v3.98.0 (2024-04-08)
(as-?dt x)
Returns given ?arg as `java.util.Date`, or nil.
as-?email
clj
(as-?email ?s)
(as-?email max-len ?s)
as-?float
clj
(as-?float x)
as-?inst
clj
added in Encore v3.98.0 (2024-04-08)
(as-?inst x)
Returns given ?arg as platform instant (`java.time.Instant` or `js/Date`), or nil.
as-?nat-float
clj
(as-?nat-float x)
as-?nat-int
clj
(as-?nat-int x)
as-?nblank
clj
(as-?nblank x)
as-?nblank-trim
clj
(as-?nblank-trim x)
as-?nemail
clj
(as-?nemail ?s)
(as-?nemail max-len ?s)
as-?nempty-str
clj
(as-?nempty-str x)
as-?nzero
clj
(as-?nzero x)
as-?pos-float
clj
(as-?pos-float x)
as-?pos-int
clj
(as-?pos-int x)
as-?qname
clj
(as-?qname x)
as-?udt
clj
(as-?udt x)
Returns given ?arg as (pos/neg) milliseconds since Unix epoch, or nil.
as-email
clj
(as-email x)
(as-email n x)
as-nat-float
clj
(as-nat-float x)
as-nat-int
clj
(as-nat-int x)
as-nblank
clj
(as-nblank x)
as-nblank-trim
clj
(as-nblank-trim x)
as-nemail
clj
(as-nemail x)
(as-nemail n x)
as-nempty-str
clj
(as-nempty-str x)
as-pnum-complement
clj
(as-pnum-complement x)
as-pos-float
clj
(as-pos-float x)
as-pos-int
clj
(as-pos-int x)
assert-min-encore-version
macro
clj
(assert-min-encore-version min-version)
Version check for dependency conflicts, etc.
assoc-nx
clj
(assoc-nx m k v)
(assoc-nx m m-kvs)
(assoc-nx m k v & kvs)
Assocs each kv to given ?map iff its key doesn't already exist.
assoc-some
clj
(assoc-some m k v)
(assoc-some m m-kvs)
(assoc-some m k v & kvs)
Assocs each kv to given ?map iff its value is not nil.
assoc-when
clj
(assoc-when m k v)
(assoc-when m m-kvs)
(assoc-when m k v & kvs)
Assocs each kv to given ?map iff its val is truthy.
ba->hex-str
clj
added in Encore v3.53.0 (2023-03-22)
(ba->hex-str ba)
Returns byte[] for given hex string.
ba-concat
clj
(ba-concat ba1 ba2)
ba-hash
clj
(ba-hash x)
Returns hash int of given byte[].
ba-split
clj
(ba-split ba idx)
ba=
clj
(ba= x y)
Returns true iff given two byte[]s with the same content.
bench
macro
clj
(bench nlaps opts & body)
bench*
clj
(bench* nlaps {:keys [nlaps-warmup nthreads as-ns?], :or {nlaps-warmup 0, nthreads 1}} f)
Repeatedly executes fn and returns time taken to complete execution.
binding
macro
clj
added in Encore v3.98.0 (2024-04-08)
(binding bindings & body)
For Clj: faster version of `core/binding`.
For Cljs: identical to `core/binding`.
bytes?
clj
(bytes? x)
Returns true iff given byte[] argument.
cache
clj
added in Encore v3.36.0 (2022-11-18)
(cache f)
(cache {:keys [size ttl-ms gc-every], :as opts} f)
Returns a cached version of given referentially transparent function `f`.
Like `core/memoize` but:
- Often faster, depending on options.
- Prevents race conditions on writes.
- Supports cache invalidation by prepending args with:
- `:cache/del` ; Delete cached item for subsequent args, returns nil.
- `:cache/fresh` ; Renew cached item for subsequent args, returns new val.
- Supports options:
- `ttl-ms` ; Expire cached items after <this> many msecs.
- `size` ; Restrict cache size to <this> many items at the next garbage
; collection (GC).
- `gc-every` ; Run garbage collection (GC) approximately once every
; <this> many calls to cached fn. If unspecified, GC rate
; will be determined automatically based on `size`.
See also `defn-cached`, `fmemoize`, `memoize-last`.
call-after-timeout
clj
(call-after-timeout msecs f)
(call-after-timeout impl_ msecs f)
Alpha, subject to change.
Returns a TimeoutFuture that will execute `f` after given msecs.
Does NOT do any automatic binding conveyance.
Performance depends on the provided timer implementation (`impl_`).
The default implementation offers O(logn) add, O(1) cancel, O(1) tick.
See `ITimeoutImpl` for extending to arbitrary timer implementations.
call-on-shutdown!
clj
added in Encore v3.114.0 (2024-08-07)
(call-on-shutdown! f)
Registers given nullary fn as a JVM shutdown hook.
(f) will be called sometime during shutdown. While running, it will
attempt to block shutdown.
case-eval
macro
clj
(case-eval expr & clauses)
Like `case` but test expressions are evaluated for their compile-time value.
case-insensitive-str=
clj
added in Encore v3.25.0 (2022-10-13)
(case-insensitive-str= s1 s2)
Returns true iff given strings are equal, ignoring case.
catching
macro
clj
(catching expr)
(catching error-type expr)
Terse, cross-platform (try* expr (catch :all _)).
See also `try*` for more flexibility.
catching-rf
clj
added in Encore v3.32.0 (2022-11-07)
(catching-rf rf)
(catching-rf error-fn rf)
Returns wrapper around given reducing function `rf` so that if `rf`
throws, (error-fn <thrown-error> <contextual-data>) will be called.
The default `error-fn` will rethrow the original error, wrapped in
extra contextual information to aid debugging.
See also `catching-xform`.
chan?
clj
(chan? x)
Returns true iff given a `clojure.core.async` channel.
chance
clj
(chance prob)
Returns true with given probability ∈ ℝ[0,1].
check-all
macro
clj
(check-all test)
(check-all test & more)
Returns all logical false/throwing expressions (ids/forms), or nil.
check-some
macro
clj
(check-some test & more)
(check-some test)
Returns first logical false/throwing expression (id/form), or nil.
clamp
clj
(clamp nmin nmax n)
clamp*
macro
clj
(clamp* nmin nmax n)
clamp-float
clj
(clamp-float nmin nmax n)
clamp-int
clj
(clamp-int nmin nmax n)
class-sym
clj
added in Encore v3.98.0 (2024-04-08)
(class-sym x)
Returns class name symbol of given argument.
comp-middleware
clj
added in Encore v3.106.0 (2024-05-01)
(comp-middleware fs)
(comp-middleware f1 f2)
(comp-middleware f1 f2 f3)
(comp-middleware f1 f2 f3 & fs)
Returns a single (composite) unary fn that applies all given unary fns
sequentially (left->right!: f1, f2, ...). If any given fn returns nil, the
returned composite fn immediately returns nil:
((comp-middleware inc #(* % 2) inc) 1) => 5 ; (inc (* (inc 1) 2))
((comp-middleware inc (fn [_] nil) (fn [_] (throw (Exception. "Never thrown!")))) 1) => nil
Useful for composing Ring-style middleware fns.
compile-if
macro
clj
(compile-if test then)
(compile-if test then else)
Evaluates `test`. If it returns logical true (and doesn't throw), expands
to `then`, otherwise expands to `else`.
compile-when
macro
clj
(compile-when test & body)
cond
macro
clj
(cond & clauses)
Supersets `core/cond` functionality. Like `core/cond` but supports implicit
final `else` clause, and special clause keywords for advanced behaviour:
(cond
:let [x "x"] ; Establish let binding/s for remaining forms
:binding [*x* "x"] ; Establish dynamic binding/s for remaining forms
:do (println (str "x value: " x)) ; Eval expr for side-effects
:if-let [y "y"
z nil]
"y and z were both truthy"
:if-some [y "y"
z nil]
"y and z were both non-nil")
`:let` support inspired by <https://github.com/Engelberg/better-cond>.
Simple, flexible way to eliminate deeply-nested control flow code.
cond!
macro
clj
(cond! & clauses)
Like `cond` but throws on non-match like `case` and `condp`.
conj-some
clj
(conj-some)
(conj-some coll)
(conj-some coll x)
(conj-some coll x & more)
Conjoins each non-nil value.
conj-when
clj
(conj-when)
(conj-when coll)
(conj-when coll x)
(conj-when coll x & more)
Conjoins each truthy value.
const-ba=
clj
(const-ba= ba1 ba2)
Constant-time `ba=`.
Useful to prevent timing attacks, etc.
const-str=
clj
(const-str= s1 s2)
Constant-time string equality checker.
Useful to prevent timing attacks, etc.
contains-in?
clj
(contains-in? coll ks k)
(contains-in? coll ks)
convey-reduced
clj
(convey-reduced x)
count-words
clj
(count-words s)
counter
clj
(counter)
(counter init)
Returns a fast atomic `Counter` with `init` initial integer value with:
- @counter => Return current val
- (counter) => Add 1 and return old val
- (counter n) => Add n and return old val
- (counter action n) => Experimental, action ∈
{:add :set :set-get :get-set :get-add :add-get}.
declare-remote
macro
clj
(declare-remote & syms)
Declares given ns-qualified symbols, preserving metadata.
Clj only. Useful for circular dependencies.
def*
macro
clj
added in Encore v3.67.0 (2023-09-08)
(def* sym & args)
Like `core/def` but supports attrs map.
defalias
macro
clj
(defalias src)
(defalias alias src)
(defalias alias src alias-attrs)
(defalias alias src alias-attrs alias-body)
Defines a local alias for the var identified by given qualified
source symbol: (defalias my-map clojure.core/map), etc.
Source var's metadata will be preserved (docstring, arglists, etc.).
Changes to Clj source var's value will also be applied to alias.
See also `defaliases`.
defaliases
macro
clj
added in Encore v3.58.0 (2023-04-09)
(defaliases {:keys [alias src attrs body]} ...)
Bulk version of `defalias`.
Takes source symbols or {:keys [alias src attrs body]} maps:
(defaliases
{:alias my-map, :src map, :attrs {:doc "My `map` alias"}}
{:alias my-vec, :src vec, :attrs {:doc "My `vec` alias"}})
default-timeout-impl_
clj
Simple one-timeout timeout implementation provided by platform timer.
O(logn) add, O(1) cancel, O(1) tick. Fns must be non-blocking or cheap.
Similar efficiency to core.async timers (binary heap vs DelayQueue).
defn-cached
macro
clj
added in Encore v3.36.0 (2022-11-18)
(defn-cached sym cache-opts & body)
Defines a cached function.
Like (def <sym> (cache <cache-opts> <body...>)), but preserves
:arglists (arity) metadata as with `defn`:
(defn-cached ^:private my-fn {:ttl-ms 500}
"Does something interesting, caches resultes for 500 msecs"
[n]
(rand-int n))
defonce
macro
clj
(defonce sym & args)
Like `core/defonce` but supports docstring and attrs map.
defstub
macro
clj
(defstub stub-sym)
Experimental, subject to change without notice!!
Declares a stub var that can be initialized from any namespace with
`unstub-<stub-name>`.
Decouples a var's declaration (location) and its initialization (value).
Useful for defining vars in a shared ns from elsewhere (e.g. a private
or cyclic ns).
deprecated
macro
clj
(deprecated & body)
Elides body when `taoensso.elide-deprecated` JVM property or
`TAOENSSO_ELIDE_DEPRECATED` environment variable is ∈ #{"true" "TRUE"}.
derefable?
clj
(derefable? x)
dissoc-in
clj
(dissoc-in m ks dissoc-k)
(dissoc-in m ks dissoc-k & more)
(dissoc-in m ks)
distinct-elements?
clj
(distinct-elements? x)
doto-cond
macro
clj
(doto-cond [sym x] & clauses)
Cross between `doto`, `cond->` and `as->`.
editable?
clj
(editable? x)
ensure-set
clj
(ensure-set x)
ensure-vec
clj
(ensure-vec x)
error?
clj
(error? x)
Returns true iff given platform error (`Throwable` or `js/Error`).
ex-cause
clj
added in Encore v3.41.0 (2022-12-03)
(ex-cause x)
Same as `core/ex-cause` (added in Clojure v1.10).
ex-data
clj
added in Encore v3.98.0 (2024-04-08)
(ex-data x)
Same as `core/ex-data` (added in Clojure v1.4).
ex-message
clj
added in Encore v3.41.0 (2022-12-03)
(ex-message x)
Same as `core/ex-message` (added in Clojure v1.10).
ex-root
clj
added in Encore v3.98.0 (2024-04-08)
(ex-root x)
Returns root cause of given platform error.
exception?
clj
(exception? x)
exp-backoff
clj
(exp-backoff n-attempt)
(exp-backoff n-attempt {:keys [min max factor], :or {factor 1000}})
Returns binary exponential backoff value for n<=36.
explode-keyword
clj
(explode-keyword k)
file-resources-modified?
clj
Returns true iff any files backing given named resources have changed since last call.
filter-keys
clj
(filter-keys key-pred m)
Returns given ?map, retaining only keys for which (key-pred <key>) is truthy.
filter-vals
clj
(filter-vals val-pred m)
Returns given ?map, retaining only keys for which (val-pred <val>) is truthy.
finite-num?
clj
(finite-num? x)
Returns true iff given a number (of standard type) that is:
finite (excl. NaN and infinities).
float?
clj
(float? x)
Returns true iff given a number (of standard type) that is:
a fixed-precision floating-point (incl. NaN and infinities).
fmemoize
clj
(fmemoize f)
For Clj: fastest possible memoize. Non-racey, 0-7 arity only.
For Cljs: same as `core/memoize`.
force-ref
clj
(force-ref x)
force-var
clj
(force-var x)
future*
macro
clj
added in Encore v3.72.0 (2023-10-24)
(future* form)
(future* executor-service form)
Experimental, subject to change without notice!
Like `future` but supports use of given custom
`java.util.concurrent.ExecutorService`.
Will default to using JVM 21+ virtual threads when possible,
otherwise an unbounded fixed daemon thread pool.
See also `future-call`, `virtual-executor`, `pool-executor`.
future-call*
clj
added in Encore v3.72.0 (2023-10-24)
(future-call* f)
(future-call* executor-service f)
Experimental, subject to change without notice!
Like `future-call` but supports use of given custom
`java.util.concurrent.ExecutorService`.
Will default to using JVM 21+ virtual threads when possible,
otherwise an unbounded fixed daemon thread pool.
See also `future`, `virtual-executor`, `pool-executor`.
future-pool
clj
(future-pool n-threads)
Returns a simple semaphore-limited wrapper of Clojure's standard `future`:
(fn future-pool-fn
([f] [timeout-msecs timeout-val f] [] [timeout-msecs timeout-val]))
Arities of returned function:
[f] - Blocks to acquire a future, then executes (f) on that future.
[ ] - Blocks to acquire ALL futures, then immediately releases them.
Useful for blocking till all outstanding work completes.
[timeout-msecs timeout-val f] - Variant of [f] with timeout
[timeout-msecs timeout-val ] - Variant of [ ] with timeout
See also `future*` for fully custom pools, etc.
get*
macro
clj
added in Encore v3.82.0 (2024-02-23)
(get* m k)
(get* m k not-found)
(get* m k1 k2 not-found)
(get* m k1 k2 k3 not-found)
Macro version of `get` that:
1. Avoids unnecessary evaluation of `not-found`.
Useful when `not-found` is expensive or contains side-effects.
2. Supports multiple prioritized keys (k1, k2, etc.). Returns val for
first key that exists in map. Useful for key aliases or fallbacks.
Equivalent to:
(cond
(contains? m k1) (get m k1)
(contains? m k2) (get m k2)
...
:else not-found)
get-env
macro
clj
added in Encore v3.75.0 (2024-01-29)
(get-env {:keys [as default return], :or {as :str, return :value}} spec)
Flexible cross-platform util to return an environmental config value.
Given an id (const keyword/string) or vector of desc-priority alternative
ids, parse and return the first of the following that exists:
- JVM property value for id
- Environment variable value for id
- Classpath resource content for id
Ids may include optional segment in `<>` tag (e.g. `<.edn>`).
Ids may include `<.?platform.?>` tag for auto replacement:
`<.platform>` => ".clj" / ".cljs"
`<platform->` => "clj-" / "cljs-", etc.
Search order: desc by combined [alt-index platform(y/n) optional(y/n)].
So (get-env {:as :edn} [:my-app/alt1<.platform><.edn> :my-app/alt2])
will parse and return the first of the following that exists:
1. Alt1 +platform +optional (optional .edn suffix)
1a. `my-app.alt1.clj.edn` JVM property value
1b. `MY_APP_ALT1_CLJ_EDN` environment variable value
1c. `my-app.alt1.clj.edn` classpath resource content
2. Alt1 +platform -optional (optional .edn suffix)
2a. `my-app.alt1.clj` JVM property value
2b. `MY_APP_ALT1_CLJ` environment variable value
2c. `my-app.alt1.clj` classpath resource content
3. Alt1 -platform +optional (optional .edn suffix)
3a. `my-app.alt1.edn` JVM property value
3b. `MY_APP_ALT1_EDN` environment variable value
3c. `my-app.alt1.edn` classpath resource content
4. Alt1 -platform -optional (optional .edn suffix)
4a. `my-app.alt1` JVM property value
4b. `MY_APP_ALT1` environment variable value
4c. `my-app.alt1` classpath resource content
5. Alt2
5a. `my-app.alt2` JVM property value
5b. `MY_APP_ALT2` environment variable value
5c. `my-app.alt2` classpath resource content
Options:
`:as` - Parse found value as given type ∈ #{:str :bool :edn} (default `:str`).
`:default` - Fallback to return unparsed if no value found during search (default `nil`).
`:return` - Return type ∈ #{:value :map :explain} (default `:value`).
For Cljs: resulting config value must be something that can be safely
embedded in code during macro expansion!
Advanced: if resulting config value is a single top-level symbol, it will
be evaluated during macro expansion.
TIP!: Use the {:return :explain} option in tests or at the REPL to
verify/inspect resulting config value, config source, and specific
search order of prop/env/res ids.
get-file-resource-?last-modified
clj
(get-file-resource-?last-modified rname)
Returns last-modified time for file backing given named resource, or nil
if file doesn't exist.
get-pom-version
clj
(get-pom-version dep-sym)
Returns POM version string for given Maven dependency, or nil.
get-source
clj
added in Encore v3.61.0 (2023-07-07)
(get-source macro-form-or-meta macro-env)
Returns {:keys [ns line column file]} source location given a macro's
compile-time `&form` and `&env` vals. See also `keep-callsite`.
get-truss-data
clj
(get-truss-data)
Returns current value of dynamic assertion data.
get1
clj
added in Encore v3.67.0 (2023-09-08)
(get1 m k)
(get1 m k not-found)
(get1 m k1 k2 not-found)
(get1 m k1 k2 k3 not-found)
Like `get` but returns val for first key that exists in map.
Useful for key aliases or fallbacks. See also `get*`.
have
macro
clj
(have x)
(have pred (:in) x)
(have pred (:in) x & more-xs)
Takes a (fn pred [x]) => truthy, and >=1 vals.
Tests pred against each val,trapping errors.
If any pred test fails, throws a detailed `ExceptionInfo`.
Otherwise returns input val/s for convenient inline-use/binding.
Respects `*assert*`, so tests can be elided from production if desired
(meaning zero runtime cost).
Provides a small, simple, flexible feature subset to alternative tools like
clojure.spec, core.typed, prismatic/schema, etc.
Examples:
(defn my-trim [x] (str/trim (have string? x)))
;; Attach arb optional info to violations using `:data`:
(have string? x
:data {:my-arbitrary-debug-info "foo"})
;; Assert inside collections using `:in`:
(have string? :in ["foo" "bar"])
Regarding use within other macros:
Due to CLJ-865, callsite info like line number of outer macro
will be lost. See `keep-callsite` for workaround.
See also `have?`, `have!`.
have!
macro
clj
(have! x)
(have! pred (:in) x)
(have! pred (:in) x & more-xs)
Like `have` but ignores `*assert*` value (so can never be elided!).
Useful for important conditions in production (e.g. security checks).
have!?
macro
clj
(have!? x)
(have!? pred (:in) x)
(have!? pred (:in) x & more-xs)
Returns `true` on successful tests, and ignores `*assert*` value
(so can never be elided!).
**WARNING**: Do NOT use in `:pre`/`:post` conditions since those always
respect `*assert*`, contradicting the intention of the bang (`!`) here.
have-core-async?
clj
Is `clojure.core.async` present (not necessarily loaded)?
have?
macro
clj
(have? x)
(have? pred (:in) x)
(have? pred (:in) x & more-xs)
Like `have` but returns `true` on successful tests.
Handy for `:pre`/`:post` conditions. Compare:
((fn my-fn [] {:post [(have nil? %)]} nil)) ; {:post [nil ]} FAILS
((fn my-fn [] {:post [(have? nil? %)]} nil)) ; {:post [true]} passes as intended
hex-ident-str
clj
added in Encore v3.128.0 (2024-10-30)
(hex-ident-str obj)
Returns hex string of given Object's `identityHashCode` (e.g. "5eeb49f2").
hex-str->ba
clj
added in Encore v3.53.0 (2023-03-22)
(hex-str->ba s)
Returns hex string for given byte[].
host-info
clj
added in Encore v3.115.0 (2024-08-18)
(host-info)
(host-info cache-msecs timeout-msecs fallback-val)
(host-info fallback-val)
(host-info timeout-msecs fallback-val)
Returns ?{:keys [ip name]} with string vals or `fallback-val` (default nil).
Arities 0 and 3 are cached, prefer these!
Arities 1 and 2 are uncached and intended for advanced users only.
host-ip
clj
added in Encore v3.115.0 (2024-08-18)
(host-ip)
(host-ip cache-msecs timeout-msecs fallback-val)
(host-ip fallback-val)
(host-ip timeout-msecs fallback-val)
Returns local host IP string or `fallback-val` (default nil).
Arities 0 and 3 are cached, prefer these!
Arities 1 and 2 are uncached and intended for advanced users only.
hostname
clj
added in Encore v3.115.0 (2024-08-18)
(hostname)
(hostname cache-msecs timeout-msecs fallback-val)
(hostname fallback-val)
(hostname timeout-msecs fallback-val)
Returns local hostname string or `fallback-val` (default nil).
Arities 0 and 3 are cached, prefer these!
Arities 1 and 2 are uncached and intended for advanced users only.
identical-kw?
macro
clj
added in Encore v3.67.0 (2023-09-08)
(identical-kw? x y)
Returns true iff two keywords are identical.
Portable and maximally fast.
For Clj this expands to: `(identical? x y)`
For Cljs this expands to: `(keyword-identical? x y)`
if-clj
macro
clj
(if-clj then & [else])
if-cljs
macro
clj
(if-cljs then & [else])
if-let
macro
clj
(if-let bindings then)
(if-let bindings then else)
Supersets `core/if-let` functionality. Like `core/if-let` but supports multiple
bindings, and unconditional bindings with `:let`:
(if-let [x (rand-nth [:x1 :x2 false nil ]) ; Bind truthy x, or -> `else`
:let [y (rand-nth [:y1 :y2 false nil x ])] ; Bind any y
z (rand-nth [:z1 :z2 false nil x y]) ; Bind truthy z, or -> `else`
]
[:then-clause x y z]
[:else-clause])
if-not
macro
clj
(if-not test-or-bindings then)
(if-not test-or-bindings then else)
Supersets `core/if-not` functionality.
Same as `encore/if-let` with `then` `and `else` forms swapped.
if-some
macro
clj
(if-some bindings then)
(if-some bindings then else)
Supersets `core/if-some` functionality. Like `core/if-some` but supports multiple
bindings, and unconditional bindings with `:let`:
(if-some [x (rand-nth [:x1 :x2 false nil ]) ; Bind non-nil x, or -> `else`
:let [y (rand-nth [:y1 :y2 false nil x ])] ; Bind any y
z (rand-nth [:z1 :z2 false nil x y]) ; Bind non-nil z, or -> `else`
]
[:then-clause x y z]
[:else-clause])
inst->udt
clj
added in Encore v3.98.0 (2024-04-08)
(inst->udt inst)
Returns given `java.time.Instant` as milliseconds since Unix epoch.
inst?
clj
(inst? x)
Returns true iff given platform instant (`java.time.Instant` or `js/Date`).
instance!
macro
clj
added in Encore v3.51.0 (2023-03-13)
(instance! class arg)
(instance! class arg {:keys [msg context param ...]})
(instance! class arg & {:keys [msg context param ...]})
If (instance? class arg) is true, returns arg.
Otherwise throws runtime `ExceptionInfo` with `unexpected-arg!`.
See `unexpected-arg!` for more info.
int?
clj
(int? x)
Returns true iff given a number (of standard type) that is:
a fixed-precision integer.
interleave-all
clj
(interleave-all)
(interleave-all c1)
(interleave-all c1 c2)
(interleave-all c1 c2 & colls)
Like `interleave` but includes all items (i.e. stops when the longest
rather than shortest coll has been consumed).
interns-overview
clj
(interns-overview)
(interns-overview ns)
Returns {:keys [api public private impl test no-doc]}, with each key mapped
to an alphabetical list of the relevant vars in given namespace.
"impl" vars are public vars with names that begin with "-" or "_",
a naming convention commonly used to indicate vars intended to be treated
as private implementation details even when public.
into!
clj
(into! to!)
(into! to! from)
(into! to! xform from)
Like `into` but assumes `to!` is a transient, and doesn't call
`persist!` when done. Useful as a performance optimization in some cases.
into-all
clj
(into-all to from)
(into-all to from & more)
Like `into` but supports multiple "from"s.
into-str
clj
(into-str & xs)
Simple Hiccup-like string templating to complement Tempura.
invert-map
clj
(invert-map m)
Returns given ?map with keys and vals inverted, dropping non-unique vals!
invert-map!
clj
added in Encore v3.121.0 (2024-09-25)
(invert-map! m)
Like `invert-map` but throws on non-unique vals.
is!
clj
(is! x)
(is! pred x)
(is! pred x data)
Lightweight `have!` that provides less diagnostic info.
ITimeoutFuture
protocol
clj
members
tf-cancel!
(tf-cancel! _)
Returns true iff the timeout was successfully cancelled (i.e. was previously pending).
tf-cancelled?
(tf-cancelled? _)
Returns true iff the timeout is cancelled.
tf-done?
(tf-done? _)
Returns true iff the timeout is not pending (i.e. has a completed result or is cancelled).
tf-pending?
(tf-pending? _)
Returns true iff the timeout is pending.
tf-poll
(tf-poll _)
Returns :timeout/pending, :timeout/cancelled, or the timeout's completed result.
tf-state
(tf-state _)
Returns a map of timeout's public state.
ITimeoutImpl
protocol
clj
members
-schedule-timeout
(-schedule-timeout _ msecs f)
java-version
clj
added in Encore v3.75.0 (2024-01-29)
(java-version)
(java-version version-string)
Returns Java's major version integer (8, 17, etc.).
java-version>=
clj
added in Encore v3.75.0 (2024-01-29)
(java-version>= n)
Returns true iff Java's major version integer is >= given integer:
(if (java-version>= 21) <then> <else>)
keep-callsite
macro
clj
added in Encore v3.61.0 (2023-07-07)
(keep-callsite form)
The long-standing CLJ-865 means that it's not possible for an inner
macro to access the `&form` metadata of a wrapping outer macro. This
means that wrapped macros lose calsite info, etc.
This util offers a workaround for macro authors:
(defmacro inner [] (meta &form))
(defmacro outer [] (keep-callsite `(inner)))
(outer) => {:keys [line column ...]}
keys-by
clj
(keys-by f coll)
Returns {(f x) x} ?map for xs in `coll`.
ks-nnil?
clj
(ks-nnil? ks m)
lazy-seq?
clj
(lazy-seq? x)
map-entry
clj
added in Encore v3.75.0 (2024-01-29)
(map-entry k v)
Returns a `MapEntry` with given key and value.
map-keys
clj
(map-keys key-fn m)
Returns given ?map with (key-fn <key>) keys.
map-vals
clj
(map-vals val-fn m)
Returns given ?map with (val-fn <val>) vals.
mapply
clj
(mapply f & args)
Like `apply` but calls `seq-kvs` on final arg.
matching-error
clj
added in Encore v3.70.0 (2023-10-17)
(matching-error err)
(matching-error kind err)
(matching-error kind pattern err)
Given a platform error and criteria, returns the error if it matches
all criteria. Otherwise returns nil.
`kind` may be:
- A predicate function, (fn match? [x]) -> bool
- A class (e.g. `ArithmeticException`, `AssertionError`, etc.)
- `:all` => any platform error (Throwable or js/Error, etc.)
- `:common` => common platform error (Exception or js/Error)
- `:ex-info` => an `IExceptionInfo` as created by `ex-info`
- A set of `kind`s as above, at least one of which must match
`pattern` may be:
- A string or Regex against which `ex-message` must match
- A map against which `ex-data` must match using `submap?`
- A set of `pattern`s as above, at least one of which must match
When an error with (nested) causes doesn't match, a match will be attempted
against its (nested) causes.
Low-level util, see also `throws`, `throws?`.
memoize
clj
(memoize f)
(memoize ttl-ms f)
(memoize size ttl-ms f)
Alternative way to call `cache`, provided mostly for back compatibility.
See `cache` docstring for details.
memoize-last
clj
(memoize-last f)
Like `core/memoize` but only caches the given fn's latest input.
Speeds repeated fn calls with the same arguments.
Great for ReactJS render fn caching, etc.
merge
clj
(merge)
(merge m1)
(merge m1 m2)
(merge m1 m2 m3)
(merge m1 m2 m3 & more)
Like `core/merge` but:
- Supports `:merge/dissoc` vals.
- Often faster, with much better worst-case performance.
merge-keywords
clj
(merge-keywords ks)
(merge-keywords ks omit-slash?)
merge-nx
clj
added in Encore v3.128.0 (2024-10-30)
(merge-nx)
(merge-nx m1)
(merge-nx m1 m2)
(merge-nx m1 m2 m3)
(merge-nx m1 m2 m3 & more)
Like `core/merge` but:
- Preserves existing values, e.g. (merge-nx <user-opts> <defaults>).
- Supports `:merge/dissoc` vals.
- Often faster, with much better worst-case performance.
merge-url-with-query-string
clj
(merge-url-with-query-string url m)
merge-with
clj
(merge-with f)
(merge-with f m1)
(merge-with f m1 m2)
(merge-with f m1 m2 m3)
(merge-with f m1 m2 m3 & more)
Like `core/merge-with` but:
- Supports `:merge/dissoc` vals.
- Often faster, with much better worst-case performance.
ms
clj
(ms opts)
(ms & {:as opts, :keys [years months weeks days hours mins secs msecs ms]})
Returns ~number of milliseconds in period defined by given args.
msecs
macro
clj
(msecs opts)
(msecs & {:as opts, :keys [years months weeks days hours mins secs msecs ms]})
name-filter
clj
added in Encore v3.67.0 (2023-09-08)
(name-filter spec)
Given filter `spec`, returns a compiled (fn match? [x]) that:
- Takes a string, keyword, symbol, or namespace.
- Returns true iff input matches spec.
Useful for efficiently filtering namespaces, class names, id kws, etc.
Spec may be:
- A namespace to match exactly
- A regex pattern to match
- A str/kw/sym to match, with "*" and "(.*)" as wildcards:
"foo.*" will match "foo.bar"
"foo(.*)" will match "foo.bar" and "foo"
If you need literal "*"s, use #"\*" regex instead.
- A set/vector of the above to match any
- A map, {:allow <spec> :disallow <spec>} with specs as the above:
If present, `:allow` spec MUST match, AND
If present, `:disallow` spec MUST NOT match.
Spec examples:
*ns*, #{}, "*", "foo.bar", "foo.bar.*", "foo.bar(.*)",
#{"foo" "bar.*"}, #"(foo1|foo2)\.bar",
{:allow #{"foo" "bar.*"} :disallow #{"foo.*.bar.*"}}.
name-with-attrs
clj
(name-with-attrs sym args)
(name-with-attrs sym args attrs-merge)
Given a symbol and args, returns [<name-with-attrs-meta> <args> <attrs>]
with support for `defn` style `?docstring` and `?attrs-map`.
nameable?
clj
(nameable? x)
nanoid
clj
(nanoid)
(nanoid len)
(nanoid secure? len)
Returns a random "Nano ID" of given length, Ref. <https://github.com/ai/nanoid>.
Faster, variable-length version of (rand-id-fn {:chars :nanoid}).
126 bits of entropy with default length (21).
See also `uuid-str`, `rand-id-fn`.
nat-float?
clj
(nat-float? x)
nblank-str?
clj
(nblank-str? x)
neg-float?
clj
(neg-float? x)
nempty-str?
clj
(nempty-str? x)
nested-merge
clj
(nested-merge)
(nested-merge m1)
(nested-merge m1 m2)
(nested-merge m1 m2 m3)
(nested-merge m1 m2 m3 & more)
Like `core/merge` but:
- Recursively merges nested maps.
- Supports `:merge/dissoc` vals.
- Often faster, with much better worst-case performance.
nested-merge-with
clj
(nested-merge-with f)
(nested-merge-with f m1)
(nested-merge-with f m1 m2)
(nested-merge-with f m1 m2 m3)
(nested-merge-with f m1 m2 m3 & more)
Like `core/merge-with` but:
- Recursively merges nested maps.
- Supports `:merge/dissoc` vals.
- Often faster, with much better worst-case performance.
new-object
macro
clj
(new-object)
newline
clj
added in Encore v3.68.0 (2023-09-25)
newlines
clj
added in Encore v3.68.0 (2023-09-25)
nnil
clj
(nnil)
(nnil x)
(nnil x y)
(nnil x y z)
(nnil x y z & more)
Returns first non-nil arg, or nil.
node-paths
clj
(node-paths m)
(node-paths node-pred m)
(node-paths node-pred m basis)
norm-str
clj
(norm-str s)
(norm-str form s)
Given a Unicode string, returns the normalized de/composed form.
It's often a good idea to normalize strings before exchange or storage,
especially if you're going to be querying against those string.
`form` is ∈ #{:nfc :nfkc :nfd :nfkd <java.text.NormalizerForm>}.
Defaults to :nfc as per W3C recommendation.
norm-word-breaks
clj
(norm-word-breaks s)
Converts all word breaks of any form and length (including line breaks of any
form, tabs, spaces, etc.) to a single regular space.
not-empty-coll
clj
(not-empty-coll x)
now-dt
clj
(now-dt)
Returns current system instant as `java.util.Date`.
now-inst
clj
added in Encore v3.66.0 (2023-08-23)
(now-inst)
Returns current system instant as `java.time.Instant`.
now-nano
clj
(now-nano)
Returns current value of best-resolution time source as nanoseconds.
now-udt
clj
(now-udt)
Returns current system instant as milliseconds since Unix epoch.
nzero-num?
clj
(nzero-num? x)
or-some
macro
clj
added in Encore v3.67.0 (2023-09-08)
(or-some)
(or-some x)
(or-some x & next)
Like `or`, but returns the first non-nil form (may be falsey).
parse-query-params
clj
(parse-query-params s & [keywordize? encoding])
Based on `ring-codec/form-decode`.
parse-version
clj
(parse-version x)
pnum-complement
clj
(pnum-complement pnum)
pnum?
clj
(pnum? x)
Returns true iff given number in unsigned unit proportion interval ∈ℝ[0,1].
pool-executor
clj
added in Encore v3.72.0 (2023-10-24)
(pool-executor {:keys [n-threads n-min-threads n-max-threads thread-name-prefix daemon-threads? keep-alive-msecs queue-type queue-size], :or {n-threads (+ 2 (get-num-threads [:ratio 1.0])), thread-name-prefix "com.taoensso/encore-pool-", daemon-threads? true, keep-alive-msecs 60000, queue-type :linked}})
Experimental, subject to change without notice!
Returns new `java.util.concurrent.ThreadPoolExecutor` with given opts.
pos-float?
clj
(pos-float? x)
pr
clj
added in Encore v3.98.0 (2024-04-08)
(pr & args)
Like `core/pr` but faster, and atomic (avoids interleaved content from different threads).
pr-edn
clj
(pr-edn x)
Prints given arg to an edn string readable with `read-edn`.
pre-cache
clj
added in Encore v3.49.0 (2023-02-01)
(pre-cache n-capacity f)
(pre-cache n-capacity fp-or-n-threads f)
Given a nullary fn `f` that is non-idempotent and free of side-effects,
returns a wrapped version of `f` that asynchronously maintains a cache
of up to `n-capacity` pre-computed return values of (f).
Useful when `f` is expensive & may be called in a spikey fashion,
e.g. ideal for cryptographic key generators.
pred
clj
added in Encore v3.75.0 (2024-01-29)
(pred pred-fn)
Experimental, subject to change without notice.
Wraps given predicate fn to return `Pred` for use with `submap?`, etc.
Arity of predicate fn depends on context in which it'll be used.
See also `pred-fn`.
pred-fn
clj
added in Encore v3.75.0 (2024-01-29)
(pred-fn pred)
Experimental, subject to change without notice.
Returns unwrapped predicate fn when given `Pred`, otherwise returns nil.
See also `pred`.
preserve-reduced
clj
(preserve-reduced rf)
Public version of `core/preserving-reduced`.
print
clj
added in Encore v3.98.0 (2024-04-08)
(print & args)
Like `core/print` but faster, and atomic (avoids interleaved content from different threads).
println
clj
added in Encore v3.98.0 (2024-04-08)
(println & args)
Like `core/println` but faster, and atomic (avoids interleaved content from different threads).
prn
clj
added in Encore v3.98.0 (2024-04-08)
(prn & args)
Like `core/prn` but faster, and atomic (avoids interleaved content from different threads).
pull-val!
clj
(pull-val! atom_ k)
(pull-val! atom_ k not-found)
Removes and returns value mapped to key:
(let [a (atom {:k :v})]
[(pull-val! a :k) @a]) => [:v {}]
qb
macro
clj
(qb spec form & more)
(qb spec form)
Simple util to benchmark/compare runtime of given form/s.
Runs sets of laps for each given form, recording the total runtime of each set.
Returns the the total runtime in msecs of the fastest set of laps for each form.
(quick-bench [<num-sets> <num-laps>] <form1> <form2> <...>) =>
[<total runtime msecs of fastest set of laps for form1>
<total runtime msecs of fastest set of laps for form2>
<...>]
Total number of runs for each form is: `num-sets` * `num-laps`
If omitted, the default `num-sets` is 6 (to include warmup):
(quick-bench <num-laps> <form1> <form2> <...>)
Example (comparing runtime of `first` and `nth` against vector):
(let [v [:a]] (quick-bench 1e6 (first v) (nth v 0))) => [67.43 39.05]
qualified-ident?
clj
(qualified-ident? x)
qualified-keyword?
clj
(qualified-keyword? x)
qualified-symbol?
clj
(qualified-symbol? x)
queue
clj
(queue coll)
(queue)
Returns a new `PersistentQueue`.
queue*
clj
(queue* & items)
Returns a new `PersistentQueue` given items.
queue?
clj
(queue? x)
Returns true iff given a `PersistentQueue`.
quick-bench
macro
clj
(quick-bench spec form & more)
(quick-bench spec form)
Simple util to benchmark/compare runtime of given form/s.
Runs sets of laps for each given form, recording the total runtime of each set.
Returns the the total runtime in msecs of the fastest set of laps for each form.
(quick-bench [<num-sets> <num-laps>] <form1> <form2> <...>) =>
[<total runtime msecs of fastest set of laps for form1>
<total runtime msecs of fastest set of laps for form2>
<...>]
Total number of runs for each form is: `num-sets` * `num-laps`
If omitted, the default `num-sets` is 6 (to include warmup):
(quick-bench <num-laps> <form1> <form2> <...>)
Example (comparing runtime of `first` and `nth` against vector):
(let [v [:a]] (quick-bench 1e6 (first v) (nth v 0))) => [67.43 39.05]
rand-bytes
clj
added in Encore v3.115.0 (2024-08-18)
(rand-bytes secure? size)
Returns a random byte array of given size.
rand-id-fn
clj
added in Encore v3.75.0 (2024-01-29)
(rand-id-fn {:keys [chars len rand-bytes-fn], :or {chars :nanoid, len 21, rand-bytes-fn (partial rand-bytes true)}})
Returns a (fn rand-id []) that returns random id strings.
Options include:
`:chars` - ∈ #{<string> :nanoid :alphanumeric :no-look-alikes ...}
`:len` - Length of id strings to generate
`:rand-bytes-fn` - Optional (fn [size]) to return random byte array of given size
See also `uuid-str`, `nano-id`.
rate-limiter
clj
(rate-limiter spec)
(rate-limiter opts spec)
Takes a spec of form
[ [<n-max-reqs> <msecs-window>] ...] or ; Unnamed limits
{<limit-id> [<n-max-reqs> <msecs-window>]} ; Named limits
and returns stateful (fn a-rate-limiter [] [req-id] [command req-id]).
Call the returned limiter fn with a request id (any Clojure value!) to
enforce limits independently for each id.
For example, (limiter-fn <ip-address-string>) will return:
- Falsey when allowed (all limits pass for given IP), or
- Truthy when disallowed (any limits fail for given IP):
[<worst-limit-id> <worst-backoff-msecs> {<limit-id> <backoff-msecs>}]
Or call the returned limiter fn with an extra command argument:
(limiter-fn :rl/peek <req-id) - Check limits WITHOUT incrementing count
(limiter-fn :rl/reset <req-id) - Reset all limits for given req-id
rcompare
clj
(rcompare x y)
re-pattern?
clj
(re-pattern? x)
read-edn
clj
(read-edn s)
(read-edn {:keys [readers default], :as opts, :or {readers clojure.core/*data-readers*, default clojure.core/*default-data-reader-fn*}})
Reads given edn string to return a Clj/s value.
reassoc-some
clj
(reassoc-some m k v)
(reassoc-some m m-kvs)
(reassoc-some m k v & kvs)
Assocs each kv to given ?map if its value is nil, otherwise dissocs it.
reduce-indexed
clj
(reduce-indexed rf init coll)
Like `reduce` but takes (rf [acc idx in]) with idx as in `map-indexed`.
As `reduce-kv` against vector coll, but works on any seqable coll type.
reduce-interleave-all
clj
added in Encore v3.66.0 (2023-08-23)
(reduce-interleave-all rf init colls)
Reduces sequence of elements interleaved from given `colls`.
(reduce-interleave-all conj [] [[:a :b] [1 2 3]]) => [:a 1 :b 2 3]
reduce-iterator!
clj
added in Encore v3.87.0 (2024-02-29)
(reduce-iterator! rf init iterator)
Reduces given `java.util.Iterator`, mutating it. Note that most colls
providing iterators implement `java.lang.Iterable`, so support `seq` directly.
reduce-kvs
clj
(reduce-kvs rf init kvs)
Like `reduce-kv` but takes a flat sequence of kv pairs.
reduce-multi
clj
added in Encore v3.66.0 (2023-08-23)
(reduce-multi rf init coll)
(reduce-multi rf1 init1 rf2 init2 coll)
(reduce-multi rf1 init1 rf2 init2 rf3 init3 coll)
Like `reduce` but supports separate simultaneous accumulators
as a micro-optimization when reducing a large collection multiple
times.
reduce-n
clj
(reduce-n rf init end)
(reduce-n rf init start end)
(reduce-n rf init start end step)
No longer useful with Clojure 1.7+, just use (reduce f init (range ...)).
reduce-top
clj
(reduce-top n rf init coll)
(reduce-top n keyfn rf init coll)
(reduce-top n keyfn cmp rf init coll)
Reduces the top `n` items from `coll` of N items.
Clj impln is O(N.logn) vs O(N.logN) for (take n (sort-by ...)).
reduce-zip
clj
added in Encore v3.33.0 (2022-11-15)
(reduce-zip rf init xs ys)
(reduce-zip rf init xs ys not-found)
Reduces given sequential xs and ys as pairs (e.g. key-val pairs).
Calls (rf acc x y) for each sequential pair.
Useful, among other things, as a more flexible version of `zipmap`.
remove-keys
clj
(remove-keys key-pred m)
Returns given ?map, removing keys for which (key-pred <key>) is truthy.
remove-vals
clj
(remove-vals val-pred m)
Returns given ?map, removing keys for which (val-pred <val>) is truthy.
rename-keys
clj
(rename-keys replacements m)
Returns a map like the one given, replacing keys using
given {<old-new> <new-key>} replacements. O(min(n_replacements, n_m)).
repeatedly-into
clj
(repeatedly-into coll n f)
Like `repeatedly` but faster and `conj`s items into given collection.
reset!?
clj
(reset!? atom_ val)
Atomically swaps value of `atom_` to `val` and returns
true iff the atom's value changed. See also `reset-in!?`.
reset-in!
clj
(reset-in! atom_ val)
(reset-in! atom_ ks val)
(reset-in! atom_ ks not-found val)
Like `reset!` but supports `update-in` semantics, returns <old-key-val>.
reset-in!?
clj
(reset-in!? atom_ val)
(reset-in!? atom_ ks val)
(reset-in!? atom_ ks not-found val)
Like `reset-in!` but returns true iff the atom's value changed.
reset-val!
clj
(reset-val! atom_ k val)
(reset-val! atom_ k not-found val)
Like `reset-in!` but optimized for single-key case.
reset-val!?
clj
(reset-val!? atom_ k new-val)
Like `reset-in!?` but optimized for single-key case.
resolve-sym
clj
added in Encore v3.63.0 (2023-07-31)
(resolve-sym sym)
(resolve-sym macro-env sym)
(resolve-sym macro-env sym may-require-ns?)
Returns resolved qualified Clj/s symbol, or nil.
revery-kv?
clj
(revery-kv? pred coll)
revery?
clj
(revery? pred coll)
(revery? xform pred coll)
rfirst
clj
(rfirst pred coll)
(rfirst xform pred coll)
rfirst-kv
clj
(rfirst-kv pred coll)
ring-redirect-resp
clj
(ring-redirect-resp url)
(ring-redirect-resp kind url)
(ring-redirect-resp kind url flash)
ring-resp-map
clj
(ring-resp-map x)
ring-set-body
clj
(ring-set-body body rresp)
ring-set-status
clj
(ring-set-status code rresp)
rnum?
clj
(rnum? x)
Returns true iff given number in signed unit proportion interval ∈ℝ[-1,1].
rolling-counter
clj
(rolling-counter msecs)
Experimental, subject to change without notice.
Returns a RollingCounter that you can:
- Invoke to increment count in last `msecs` window and return RollingCounter.
- Deref to return count in last `msecs` window.
rolling-list
clj
added in Encore v3.45.0 (2022-12-13)
(rolling-list nmax)
(rolling-list nmax {:keys [init-val]})
Returns a stateful fn of 2 arities:
[ ] => Returns current array in O(n).
[x] => Adds `x` to right of list, maintaining length <~ `nmax`.
Returns nil. Very fast (faster than `rolling-vector`).
Useful for maintaining limited-length histories, etc.
See also `rolling-vector`.
rolling-vector
clj
added in Encore v3.45.0 (2022-12-13)
(rolling-vector nmax)
(rolling-vector nmax {:keys [gc-every init-val], :or {gc-every 16000.0}})
Returns a stateful fn of 2 arities:
[ ] => Returns current sub/vector in O(1).
[x] => Adds `x` to right of sub/vector, maintaining length <= `nmax`.
Returns current sub/vector.
Useful for maintaining limited-length histories, etc.
See also `rolling-list` (Clj only).
round
clj
(round n)
(round kind n)
(round kind precision n)
General purpose rounding util.
Returns given number `n` rounded according to given options:
- `kind` - ∈ #{:round :floor :ceil :trunc} (default `:round`)
- `precision` - Number of decimal places to include (default `nil` => none)
roundn
clj
(roundn precision n)
rsome
clj
(rsome pred coll)
(rsome xform pred coll)
rsome-kv
clj
(rsome-kv pred coll)
run-kv!
clj
(run-kv! proc m)
run-kvs!
clj
(run-kvs! proc kvs)
runner
clj
added in Encore v3.68.0 (2023-09-25)
(runner {:as opts, :keys [mode buffer-size n-threads thread-name drain-msecs auto-stop? convey-bindings? daemon-threads?], :or {mode :blocking, buffer-size 1024, n-threads 1, drain-msecs 6000, auto-stop? true, convey-bindings? true, daemon-threads? true}})
Experimental, subject to change without notice!
Returns a new stateful "runner" such that:
(runner f) ; Arity 1 call
Requests runner to execute given nullary fn according to runner's opts.
Returns:
- `true` if runner accepted fn for execution without back-pressure.
- `false` if runner experienced back-pressure (fn may/not execute).
- `nil` if runner has stopped accepting new execution requests.
(deref runner)
Returns a promise that will be delivered once all pending execution
requests complete.
(runner) ; Arity 0 call
Causes runner to permanently stop accepting new execution requests.
On first call returns a promise that will be delivered once all pending
execution requests complete. On subsequent calls returns nil.
Runners are a little like agents, but:
- Take nullary fns rather than unary fns of state.
- Have no validators or watches.
- Have configurable back-pressure.
- Can have >1 thread (in which case fns may execute out-of-order!).
These properties make them useful as configurable general-purpose async workers.
Options include:
`:buffer-size` (default 1024)
Size of request buffer, and the max number of pending requests before
configured back-pressure behaviour is triggered (see `:mode`).
`:mode` (default `:blocking`)
Back-pressure mode ∈ #{:blocking :dropping :sliding}.
Controls what happens when a new request is made while request buffer is full:
`:blocking` => Blocks caller until buffer space is available
`:dropping` => Drops the newest request (noop)
`:sliding` => Drops the oldest request
`:n-threads` (default 1)
Number of threads to use for executing fns (servicing request buffer).
NB execution order may be non-sequential when n > 1.
`:drain-msecs` (default 6000 msecs)
Maximum time (in milliseconds) to try allow pending execution requests to
complete when stopping runner. nil => no maximum.
satisfies!
macro
clj
added in Encore v3.51.0 (2023-03-13)
(satisfies! protocol arg)
(satisfies! protocol arg {:keys [msg context param ...]})
(satisfies! protocol arg & {:keys [msg context param ...]})
If (satisfies? protocol arg) is true, returns arg.
Otherwise throws runtime `ExceptionInfo` with `unexpected-arg!`.
See `unexpected-arg!` for more info.
satisfies?
macro
clj
added in Encore v3.75.0 (2024-01-29)
(satisfies? protocol x)
Faster `satisfies?` to work around CLJ-1814 until a proper upstream fix.
May cache, so possibly inappropriate for dynamic work.
sb-append
clj
(sb-append str-builder x)
(sb-append str-builder x & more)
Appends given string/s to given string builder. See also `str-builder.`
sb-length
clj
added in Encore v3.107.0 (2024-05-05)
(sb-length sb)
Returns given string builder's current length (character count).
secs
clj
(secs opts)
(secs & {:as opts, :keys [years months weeks days hours mins secs msecs ms]})
Returns ~number of seconds in period defined by given args.
secs->ms
clj
(secs->ms secs)
secure-rng
clj
(secure-rng)
Returns an auto-reseeding thread-local `java.security.SecureRandom`.
Favours security over performance. May block while waiting on entropy!
secure-rng-mock!!!
clj
added in Encore v3.53.0 (2023-03-22)
(secure-rng-mock!!! long-seed)
Returns **INSECURE** `java.security.SecureRandom` mock instance backed by
a seeded deterministic `java.util.Random`. Useful for testing, etc.
select-nested-keys
clj
added in Encore v3.34.0 (2022-11-16)
(select-nested-keys src-map key-spec)
Like `select-keys` but supports nested key spec:
(select-nested-keys
{:a :A :b :B :c {:c1 :C1 :c2 :C2} :d :D} ; `src-map`
[:a {:c [:c1], :d [:d1 :d2]}]) ; `key-spec`
=> {:a :A, :c {:c1 :C1}, :d :D}
Note that as with the `{:d [:d1 :d2]}` spec in the example above,
if spec expects a nested map but the actual value is not a map,
the actual value will be included in output as-is.
Has the same behaviour as `select-keys` when `key-spec` is a
simple vector of keys.
seq-kvs
clj
(seq-kvs {:a :A}) => (:a :A).
session-swap
clj
(session-swap rreq rresp f & args)
Util to help correctly update Ring sessions (something easy to get wrong!).
Given a Ring request (rreq) and Ring response (rresp), returns a new
Ring response with the response session updated to be (f <old-session>)
or (apply f <old-session> args).
set-var-root!
macro
clj
added in Encore v3.75.0 (2024-01-29)
(set-var-root! var-sym root-val)
Sets root binding (value) of the var identified by given symbol, and returns
the new value. Cross-platform. See also `update-var-root!`.
simple-ident?
clj
(simple-ident? x)
simple-keyword?
clj
(simple-keyword? x)
simple-symbol?
clj
(simple-symbol? x)
slurp-file-resource
clj
Like `slurp-resource` but caches slurps against file's last-modified udt.
slurp-resource
clj
(slurp-resource rname)
Returns slurped named resource on classpath, or nil when resource not found.
some=
clj
(some= x y)
(some= x y & more)
some?
clj
(some? x)
Same as `core/some?` (added in Clojure v1.6).
sortv
clj
(sortv coll)
(sortv comparator coll)
(sortv ?keyfn comparator coll)
Like `core/sort` but:
- Returns a vector.
- `comparator` can be `:asc`, `:desc`, or an arbitrary comparator.
- An optional `keyfn` may be provided, as in `core/sort-by`.
str->utf8-ba
clj
added in Encore v3.53.0 (2023-03-22)
(str->utf8-ba s)
Returns given String encoded as a UTF-8 byte[].
str-?index
clj
(str-?index s substr)
(str-?index s substr start-idx)
(str-?index s substr start-idx last?)
Returns (first/last) ?index of substring if it exists within given string.
str-builder
clj
(str-builder)
(str-builder init)
Returns a new stateful string builder:
- `java.lang.StringBuilder` for Clj
- `goog.string.StringBuffer` for Cljs
See also `sb-append`.
str-builder?
clj
(str-builder? x)
str-contains?
clj
(str-contains? s substr)
str-ends-with?
clj
(str-ends-with? s substr)
str-join
clj
(str-join xs)
(str-join separator xs)
(str-join separator xform xs)
Faster generalization of `clojure.string/join` with transducer support.
str-join-once
clj
(str-join-once separator coll)
Like `string/join` but skips nils and duplicate separators.
str-replace
clj
(str-replace s match replacement)
str-rf
clj
(str-rf)
(str-rf acc)
(str-rf acc in)
String builder reducing fn.
submap?
clj
(submap? m sub)
Returns true iff `sub` is a (possibly nested) submap of `m`,
i.e. iff every (nested) value in `sub` has the same (nested) value in `m`.
Uses stack recursion so supports only limited nesting.
submaps?
clj
added in Encore v3.98.0 (2024-04-08)
(submaps? maps subs)
Experimental, subject to change without notice.
Returns true iff `sub_i` is a (possibly nested) submap of `m_i`.
Uses `submap?`.
substr
clj
added in Encore v3.126.0 (2024-10-23)
(substr s start-idx)
(substr s start-idx end-idx)
(substr s kind start end)
Returns a non-empty sub-string, or nil.
Like `subs` but:
- Doesn't throw when out-of-bounds (clips to bounds).
- Returns nil rather than an empty string.
- When given `:by-len` kind (4-arity case):
- `start` may be -ive (=> index from right of string).
- `end` is desired string length, or `:max`.
subvec
clj
added in Encore v3.126.0 (2024-10-23)
(subvec v start-idx)
(subvec v start-idx end-idx)
(subvec v kind start end)
Returns a non-empty sub-vector, or nil.
Like `core/subvec` but:
- Doesn't throw when out-of-bounds (clips to bounds).
- Returns nil rather than an empty vector.
- When given `:by-len` kind (4-arity case):
- `start` may be -ive (=> index from right of vector).
- `end` is desired vector length, or `:max`.
swap-in!
clj
(swap-in! atom_ f)
(swap-in! atom_ ks f)
(swap-in! atom_ ks not-found f)
Like `swap!` but supports `update-in` semantics and `swapped`.
Returns <new-key-val> or <swapped-return-val>:
(swap-in! (atom {:k1 {:k2 5}}) [:k1 :k2] inc) => 6
(swap-in! (atom {:k1 {:k2 5}}) [:k1 :k2]
(fn [old] (swapped (inc old) old))) => 5
swap-val!
clj
(swap-val! atom_ k f)
(swap-val! atom_ k not-found f)
Like `swap-in!` but optimized for single-key case:
(swap-val! (atom {:k 5}) :k inc) => 6
(swap-val! (atom {:k 5}) :k
(fn [old] (swapped (inc old) old))) => 5
swapped
clj
(swapped new-val return-val)
For use within the swap functions of `swap-in!` and `swap-val!`.
Allows the easy decoupling of new and returned values. Compare:
(let [a (atom 0)] [(core/swap! a (fn [old] (inc old) )) @a]) [1 1] ; new=1, return=1
(let [a (atom 0)] [(swap-in! a (fn [old] (swapped (inc old) old))) @a]) [0 1] ; new=1, return=0
Faster and much more flexible than `core/swap-vals!`, etc.
Especially useful when combined with the `update-in` semantics of `swap-in!`, etc.
swapped?
clj
(swapped? x)
Returns true iff given `Swapped` argument.
test-fixtures
clj
added in Encore v3.31.0 (2022-10-27)
(test-fixtures fixtures-map)
Given a {:before ?(fn []) :after ?(fn [])} map, returns cross-platform
test fixtures for use by both `clojure.test` and `cljs.test`:
(let [f (test-fixtures {:before (fn [] (test-setup))})]
(clojure.test/use-fixtures :once f)
(cljs.test/use-fixtures :once f))
thread-id
clj
added in Encore v3.115.0 (2024-08-18)
(thread-id)
Returns long id of current `Thread`.
thread-info
clj
added in Encore v3.115.0 (2024-08-18)
(thread-info)
Returns {:keys [group name id]} for current `Thread`.
thread-local
macro
clj
added in Encore v3.48.0 (2023-01-25)
(thread-local & body)
Given a body that returns an initial value for the current thread,
returns a `ThreadLocal` proxy that can be derefed to get the current
thread's current value.
Commonly used to achieve thread safety during Java interop.
In the common case, `body` will be a call to some Java constructor
that returns a non-thread-safe instance.
Example:
(def thread-local-simple-date-format_
"Deref to return a thread-local `SimpleDateFormat`"
(thread-local (SimpleDateFormat. "yyyy-MM-dd")))
(.format @thread-local-simple-date-format_ (Date.)) => "2023-01-24"
NB: don't pass the derefed value to other threads!
thread-local*
clj
added in Encore v3.48.0 (2023-01-25)
(thread-local* init-val-fn)
Low-level, see `thread-local` instead.
thread-local-proxy
macro
clj
(thread-local-proxy & body)
Low-level, see `thread-local` instead.
thread-name
clj
added in Encore v3.115.0 (2024-08-18)
(thread-name)
Returns string name of current `Thread`.
throwable?
clj
(throwable? x)
throws
macro
clj
added in Encore v3.31.0 (2022-10-27)
(throws form)
(throws kind form)
(throws kind pattern form)
Evals `form` and if it throws an error that matches given criteria using
`matching-error`, returns the matching error. Otherwise returns nil.
See also `matching-error`, `throws?`.
throws?
macro
clj
added in Encore v3.31.0 (2022-10-27)
(throws? form)
(throws? kind form)
(throws? kind pattern form)
Evals `form` and if it throws an error that matches given criteria using
`matching-error`, returns true. Otherwise returns false.
Useful for unit tests, e.g.:
(is (throws? {:a :b} (throw (ex-info "Test" {:a :b :c :d}))))
See also `matching-error`, `throws`.
time-ms
macro
clj
(time-ms & body)
Returns number of milliseconds it took to execute body.
time-ns
macro
clj
(time-ns & body)
Returns number of nanoseconds it took to execute body.
timeout-future?
clj
(timeout-future? x)
top
clj
(top n coll)
(top n keyfn coll)
(top n keyfn cmp coll)
Returns a sorted vector of the top `n` items from `coll` using `reduce-top`.
top-into
clj
(top-into to n coll)
(top-into to n keyfn coll)
(top-into to n keyfn cmp coll)
Conjoins the top `n` items from `coll` into `to` using `reduce-top`.
transient?
clj
(transient? x)
try*
macro
clj
added in Encore v3.67.0 (2023-09-08)
(try* expr* catch-clauses* ?finally-clause)
Like `try`, but `catch` clause class may be:
`:ex-info` - Catches only `ExceptionInfo`
`:common` - Catches `js/Error` (Cljs), `Exception` (Clj)
`:all` - Catches `:default` (Cljs), `Throwable` (Clj)
`:all-but-critical` - Catches `:default` (Cljs), `Exception` and `AssertionError` (Clj)
Addresses CLJ-1293 and the fact that `AssertionError`s are typically NON-critical
(so desirable to catch, in contrast to other `Error` classes).
udt->inst
clj
added in Encore v3.98.0 (2024-04-08)
(udt->inst msecs-since-epoch)
Returns given milliseconds since Unix epoch as `java.time.Instant`.
unexpected-arg!
clj
added in Encore v3.51.0 (2023-03-13)
(unexpected-arg! arg)
(unexpected-arg! arg {:keys [msg context param expected ...]})
(unexpected-arg! arg & {:keys [msg context param expected ...]})
Throws runtime `ExceptionInfo` to indicate an unexpected argument.
Takes optional kvs for merging into exception's data map.
(let [mode :unexpected]
(case mode
:read (do <...>)
:write (do <...>)
(unexpected-arg! mode
{:context `my-function
:param 'mode
:expected #{:read :write}}))) =>
Unexpected argument: :unexpected
{:arg {:value :unexpected, :type clojure.lang.Keyword},
:context 'taoensso.encore/my-function
:param 'mode
:expected #{:read :write}}
See also `bad-arg!`.
update!
clj
(update! m k f)
update-in
clj
(update-in m ks f)
(update-in m ks not-found f)
Like `core/update-in` but:.
- Empty ks will return (f m), not act like [nil] ks.
- Adds support for `not-found`.
- Adds support for special return vals: `:update/dissoc`, `:update/abort`.
update-var-root!
macro
clj
added in Encore v3.68.0 (2023-09-25)
(update-var-root! var-sym update-fn)
Updates root binding (value) of the var identified by given symbol, and returns
the new value:
(update-var-root! my-var (fn [old-root-val] <new-root-val>)) => <new-root-val>
Similar to `alter-var-root` but cross-platform and takes a symbol rather than a var.
See also `set-var-root!`.
url-decode
clj
(url-decode s & [encoding])
url-encode
clj
(url-encode s & [encoding])
utf8-ba->str
clj
added in Encore v3.53.0 (2023-03-22)
(utf8-ba->str ba)
Returns String by decoding given UTF-8 byte[].
uuid
clj
added in Encore v3.75.0 (2024-01-29)
(uuid)
For Clj: returns a random `java.util.UUID`.
For Cljs: returns a random UUID string.
Uses strong randomness when possible.
See also `uuid-str`, `nanoid`, `rand-id-fn`.
uuid-str
clj
(uuid-str max-len)
(uuid-str)
Returns a random UUID string of given length (max 36).
Uses strong randomness when possible. See also `uuid`, `nanoid`, `rand-id-fn`.
vinterleave-all
clj
added in Encore v3.66.0 (2023-08-23) for !=2 arities
(vinterleave-all colls)
(vinterleave-all c1 c2)
(vinterleave-all c1 c2 c3)
(vinterleave-all c1 c2 c3 & colls)
Like `interleave`, but:
- Returns a vector rather than lazy seq (=> greedy).
- Includes all items (i.e. stops when the longest rather than
shortest coll has been consumed).
Single-arity version takes a coll of colls.
virtual-executor
clj
added in Encore v3.72.0 (2023-10-24)
(virtual-executor)
Experimental, subject to change without notice!
Returns new virtual `java.util.concurrent.ThreadPerTaskExecutor` when
possible (JVM 21+), otherwise returns nil.
vsplit-first
clj
(vsplit-first v)
vsplit-last
clj
(vsplit-last v)
when
macro
clj
(when test-or-bindings & body)
Supersets `core/when` and `core/when-let` functionality. When `test-or-bindings` is
a vector, same as `encore/when-let`. Otherwise same as `core/when`.
when-let
macro
clj
(when-let bindings & body)
Supersets `core/when-let` functionality. Like `core/when-let` but supports multiple
bindings, and unconditional bindings with `:let`:
(when-let [x (rand-nth [:x1 :x2 false nil ]) ; Bind truthy x, or -> nil
:let [y (rand-nth [:y1 :y2 false nil x ])] ; Bind any y
z (rand-nth [:z1 :z2 false nil x y]) ; Bind truthy z, or -> nil
]
[:body x y z])
when-not
macro
clj
(when-not test-or-bindings & body)
Supersets `core/when-not` functionality.
Same as `encore/if-let` with `body` as `else` form.
when-some
macro
clj
(when-some test-or-bindings & body)
Supersets `core/when-some` functionality. Like `core/when-some` but supports multiple
bindings, and unconditional bindings with `:let`:
(when-some [x (rand-nth [:x1 :x2 false nil ]) ; Bind non-nil x, or -> `else`
:let [y (rand-nth [:y1 :y2 false nil x ])] ; Bind any y
z (rand-nth [:z1 :z2 false nil x y]) ; Bind non-nil z, or -> `else`
]
[:body x y z])
with-truss-data
macro
clj
(with-truss-data data & body)
Executes body with dynamic assertion data bound to given value.
This data will be included in any violation errors thrown by body.
xdistinct
clj
(xdistinct)
(xdistinct keyfn)
Returns a stateful transducer like (core/distinct) that supports an optional
key function. Retains only items with distinct (keyfn <item>).
zero-num?
clj
(zero-num? x)