Extended core library for Clojure/Script that emphasizes:
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
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
(<* x y z)
(<=* x y z)
(>* x y z)
(>=* x y z)
Example UTF-8 string for tests, etc.
Example UTF-8 string for tests, etc.
(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 2 :foo.bar/baz) => :foo.bar/baz (abbreviate-ns 1 :foo.bar/baz) => :f.bar/baz (abbreviate-ns 0 :foo.bar/baz) => :f.b/baz
Give any nameable type (string, keyword, symbol), returns the same type with at most `n-full` (default 1) unabbreviated namespace parts. Example: (abbreviate-ns 2 :foo.bar/baz) => :foo.bar/baz (abbreviate-ns 1 :foo.bar/baz) => :f.bar/baz (abbreviate-ns 0 :foo.bar/baz) => :f.b/baz
(abs n)
(after-timeout msecs & body)
Alpha, subject to change. Returns a TimeoutFuture that will execute body after timeout. Body must be non-blocking or cheap.
Alpha, subject to change. Returns a TimeoutFuture that will execute body after timeout. Body must be non-blocking or cheap.
(ajax-call url
{:keys [method params headers timeout-ms resp-type with-credentials?
xhr-pool xhr-cb-fn xhr-timeout-ms]
:as opts
:or {method :get
timeout-ms 10000
resp-type :auto
xhr-pool default-xhr-pool_
xhr-timeout-ms 2500}}
callback-fn)
Queues a lightweight Ajax call with Google Closure's goog.net.XhrIo
and returns nil, or the resulting goog.net.XhrIo
instance if one was
immediately available from the XHR pool:
(ajax-call "http://localhost:8080/my-post-route" ; Endpoint URL
{:method :post ; ∈ #{:get :post :put}
:resp-type :text ; ∈ #{:auto :edn :json :xml :text
; :bin/array-buffer :bin/blob} ; Expected response type
:headers {"Content-Type" "text/plain"} ; Request headers
:params {:username "Rich Hickey" :type "Awesome"} ; Request params
:timeout-ms 10000 ; Request timeout in msecs
:with-credentials? false ; Enable if using CORS
:xhr-pool my-xhr-pool ; Optional `goog.net.XhrIoPool` instance or delay
:xhr-cb-fn (fn [xhr]) ; Optional fn to call with `XhrIo` from pool when available
:xhr-timeout-ms 2500 ; Optional max msecs to wait on pool for `XhrIo`
}
(fn callback [resp-map]
(let [{:keys [success? ?status ?error ?content ?content-type]} resp-map]
;; ?status ; ∈ #{nil 200 404 ...}, non-nil iff server responded
;; ?error ; ∈ #{nil <http-error-status-code> <exception> :timeout
:abort :http-error :exception :xhr-pool-depleted :bad-edn}
(js/alert (str "Ajax response: " resp-map)))))
Queues a lightweight Ajax call with Google Closure's `goog.net.XhrIo` and returns nil, or the resulting `goog.net.XhrIo` instance if one was immediately available from the XHR pool: (ajax-call "http://localhost:8080/my-post-route" ; Endpoint URL {:method :post ; ∈ #{:get :post :put} :resp-type :text ; ∈ #{:auto :edn :json :xml :text ; :bin/array-buffer :bin/blob} ; Expected response type :headers {"Content-Type" "text/plain"} ; Request headers :params {:username "Rich Hickey" :type "Awesome"} ; Request params :timeout-ms 10000 ; Request timeout in msecs :with-credentials? false ; Enable if using CORS :xhr-pool my-xhr-pool ; Optional `goog.net.XhrIoPool` instance or delay :xhr-cb-fn (fn [xhr]) ; Optional fn to call with `XhrIo` from pool when available :xhr-timeout-ms 2500 ; Optional max msecs to wait on pool for `XhrIo` } (fn callback [resp-map] (let [{:keys [success? ?status ?error ?content ?content-type]} resp-map] ;; ?status ; ∈ #{nil 200 404 ...}, non-nil iff server responded ;; ?error ; ∈ #{nil <http-error-status-code> <exception> :timeout :abort :http-error :exception :xhr-pool-depleted :bad-edn} (js/alert (str "Ajax response: " resp-map)))))
(approx== x y)
(approx== signf x y)
(as-?bool x)
(as-?dt x)
Returns given ?arg as java.util.Date
, or nil.
Returns given ?arg as `java.util.Date`, or nil.
(as-?email ?s)
(as-?email max-len ?s)
(as-?float x)
(as-?inst x)
Returns given ?arg as platform instant (java.time.Instant
or js/Date
), or nil.
Returns given ?arg as platform instant (`java.time.Instant` or `js/Date`), or nil.
(as-?int x)
(as-?kw x)
(as-?name x)
(as-?nat-float x)
(as-?nat-int x)
(as-?nblank x)
(as-?nblank-trim x)
(as-?nemail ?s)
(as-?nemail max-len ?s)
(as-?nempty-str x)
(as-?nzero x)
(as-?pnum x)
(as-?pos-float x)
(as-?pos-int x)
(as-?qname x)
(as-?rnum x)
(as-?udt x)
Returns given ?arg as (pos/neg) milliseconds since Unix epoch, or nil.
Returns given ?arg as (pos/neg) milliseconds since Unix epoch, or nil.
(as-bool x)
(as-dt x)
(as-email x)
(as-email n x)
(as-float x)
(as-inst x)
(as-int x)
(as-kw x)
(as-name x)
(as-nat-float x)
(as-nat-int x)
(as-nblank x)
(as-nblank-trim x)
(as-nemail x)
(as-nemail n x)
(as-nempty-str x)
(as-nzero x)
(as-pnum x)
(as-pnum! x)
(as-pnum-complement x)
(as-pos-float x)
(as-pos-int x)
(as-qname x)
(as-rnum x)
(as-rnum! x)
(as-udt x)
(assert-min-encore-version min-version)
Version check for dependency conflicts, etc.
Version check for dependency conflicts, etc.
(assoc-nx m m-kvs)
(assoc-nx m k v)
(assoc-nx m k v & kvs)
Assocs each kv to given ?map iff its key doesn't already exist.
Assocs each kv to given ?map iff its key doesn't already exist.
(assoc-some m m-kvs)
(assoc-some m k v)
(assoc-some m k v & kvs)
Assocs each kv to given ?map iff its value is not nil.
Assocs each kv to given ?map iff its value is not nil.
(assoc-when m m-kvs)
(assoc-when m k v)
(assoc-when m k v & kvs)
Assocs each kv to given ?map iff its val is truthy.
Assocs each kv to given ?map iff its val is truthy.
(atom? x)
(ba->hex-str ba)
Returns byte[] for given hex string.
Returns byte[] for given hex string.
(ba-concat ba1 ba2)
(ba-hash x)
Returns hash int of given byte[].
Returns hash int of given byte[].
(ba-split ba idx)
(ba= x y)
Returns true iff given two byte[]s with the same content.
Returns true iff given two byte[]s with the same content.
(bench nlaps opts & body)
(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.
Repeatedly executes fn and returns time taken to complete execution.
(binding bindings & body)
(binding* bindings & body)
For Clj: faster version of core/binding
.
For Cljs: identical to core/binding
.
Can interfere with some deep-walking macros.
For Clj: faster version of `core/binding`. For Cljs: identical to `core/binding`. Can interfere with some deep-walking macros.
(boolean? x)
(bytes? x)
Returns true iff given byte[] argument.
Returns true iff given byte[] argument.
(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
.
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 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.
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! 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.
Registers given nullary fn as a JVM shutdown hook. (f) will be called sometime during shutdown. While running, it will attempt to block shutdown.
(can-meta? x)
(case-eval expr & clauses)
Like case
but test expressions are evaluated for their compile-time value.
Like `case` but test expressions are evaluated for their compile-time value.
(case-insensitive-str= s1 s2)
Returns true iff given strings are equal, ignoring case.
Returns true iff given strings are equal, ignoring case.
(catching expr)
(catching error-type expr)
(catching try-expr error-sym catch-expr)
(catching try-expr error-sym catch-expr finally-expr)
(catching try-expr error-type error-sym catch-expr finally-expr)
Terse, cross-platform (try* expr (catch :all _)).
Arities besides #{1 2} are deprecated, prefer try*
in these cases.
Terse, cross-platform (try* expr (catch :all _)). Arities besides #{1 2} are deprecated, prefer `try*` in these cases.
(chan? x)
Returns true iff given a clojure.core.async
channel.
Returns true iff given a `clojure.core.async` channel.
(chance prob)
Returns true with given probability ∈ ℝ[0,1].
Returns true with given probability ∈ ℝ[0,1].
(clamp nmin nmax n)
(clamp* nmin nmax n)
(clamp-float nmin nmax n)
(clamp-int nmin nmax n)
(class-sym x)
Returns class name symbol of given argument.
Returns class name symbol of given argument.
(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
.
Evaluates `test`. If it returns logical true (and doesn't throw), expands to `then`, otherwise expands to `else`.
(compile-when test & body)
(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" :else "fallback value")
Simple, flexible way to eliminate deeply-nested control flow code.
:let
support inspired by https://github.com/Engelberg/better-cond.
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" :else "fallback value") Simple, flexible way to eliminate deeply-nested control flow code. `:let` support inspired by <https://github.com/Engelberg/better-cond>.
(cond! & clauses)
Like cond
but throws on non-match like case
and condp
.
Like `cond` but throws on non-match like `case` and `condp`.
(conj-some)
(conj-some coll)
(conj-some coll x)
(conj-some coll x & more)
Conjoins each non-nil value.
Conjoins each non-nil value.
(conj-when)
(conj-when coll)
(conj-when coll x)
(conj-when coll x & more)
Conjoins each truthy value.
Conjoins each truthy value.
(const-ba= ba1 ba2)
Constant-time ba=
.
Useful to prevent timing attacks, etc.
Constant-time `ba=`. Useful to prevent timing attacks, etc.
(const-str= s1 s2)
Constant-time string equality checker. Useful to prevent timing attacks, etc.
Constant-time string equality checker. Useful to prevent timing attacks, etc.
(contains-in? coll ks)
(contains-in? coll ks k)
(convey-reduced x)
(count-words s)
(counter)
(counter init)
Returns a fast atomic Counter
with init
initial integer value with:
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 & syms)
Declares given ns-qualified symbols, preserving metadata. Clj only. Useful for circular dependencies.
Declares given ns-qualified symbols, preserving metadata. Clj only. Useful for circular dependencies.
(def* sym ?docstring ?attrs-map init-expr)
Like core/def
but supports attrs map.
Like `core/def` but supports attrs map.
(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
.
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 {: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"}})
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"}})
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).
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 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))
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 sym ?docstring ?attrs-map init-expr)
Like core/defonce
but supports docstring and attrs map.
Like `core/defonce` but supports docstring and attrs map.
(defstub stub-sym)
(defstub stub-sym & more)
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).
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 & body)
Elides body when taoensso.elide-deprecated
JVM property or
TAOENSSO_ELIDE_DEPRECATED
environment variable is ∈ #{"true" "TRUE"}.
Elides body when `taoensso.elide-deprecated` JVM property or `TAOENSSO_ELIDE_DEPRECATED` environment variable is ∈ #{"true" "TRUE"}.
(derefable? x)
(dissoc-in m ks)
(dissoc-in m ks dissoc-k)
(dissoc-in m ks dissoc-k & more)
(distinct-elements? x)
(doto-cond [sym x] & clauses)
Cross between doto
, cond->
and as->
.
Cross between `doto`, `cond->` and `as->`.
(editable? x)
(ensure-set x)
(ensure-vec x)
(error? x)
Returns true iff given platform error (Throwable
or js/Error
).
Returns true iff given platform error (`Throwable` or `js/Error`).
(exception? x)
(exp-backoff n-attempt)
(exp-backoff n-attempt {:keys [min max factor] :or {factor 1000}})
Returns binary exponential backoff value for n<=36.
Returns binary exponential backoff value for n<=36.
Returns true iff any files backing given named resources have changed since last call.
Returns true iff any files backing given named resources have changed since last call.
(filter-keys key-pred m)
Returns given ?map, retaining only keys for which (key-pred <key>) is truthy.
Returns given ?map, retaining only keys for which (key-pred <key>) is truthy.
(filter-vals val-pred m)
Returns given ?map, retaining only keys for which (val-pred <val>) is truthy.
Returns given ?map, retaining only keys for which (val-pred <val>) is truthy.
(finite-num? x)
Returns true iff given a number (of standard type) that is: finite (excl. NaN and infinities).
Returns true iff given a number (of standard type) that is: finite (excl. NaN and infinities).
(float? x)
Returns true iff given a number (of standard type) that is: a fixed-precision floating-point (incl. NaN and infinities).
Returns true iff given a number (of standard type) that is: a fixed-precision floating-point (incl. NaN and infinities).
(fmemoize f)
For Clj: fastest possible memoize. Non-racey, 0-7 arity only.
For Cljs: same as core/memoize
.
For Clj: fastest possible memoize. Non-racey, 0-7 arity only. For Cljs: same as `core/memoize`.
(format fmt & args)
Like core/format
but:
format
!).Like `core/format` but: * Returns "" when fmt is nil rather than throwing an NPE. * Formats nil as "nil" rather than "null". * Provides ClojureScript support via goog.string.format (this has fewer formatting options than Clojure's `format`!).
(format* fmt args)
(format* xform fmt args)
(format-inst inst)
Takes a platform instant (java.time.Instant
or js/Date
) and
returns a formatted human-readable string in ISO8601
format
(YYYY-MM-DDTHH:mm:ss.sssZ
), e.g. "2011-12-03T10:15:130Z".
Takes a platform instant (`java.time.Instant` or `js/Date`) and returns a formatted human-readable string in `ISO8601` format (`YYYY-MM-DDTHH:mm:ss.sssZ`), e.g. "2011-12-03T10:15:130Z".
(format-inst-fn)
(format-inst-fn {:keys [formatter zone]
:or {formatter java.time.format.DateTimeFormatter/ISO_INSTANT
zone java.time.ZoneOffset/UTC}})
(format-inst-fn)
(format-inst-fn {:keys [formatter]})
Experimental, subject to change without notice.
Returns a (fn format [instant]) that:
java.time.Instant
or js/Date
).Options:
:formatter
Clj: java.time.format.DateTimeFormatter
Cljs: goog.i18n.DateTimeFormat
Defaults to `ISO8601` formatter (`YYYY-MM-DDTHH:mm:ss.sssZ`),
e.g.: "2011-12-03T10:15:130Z".
:zone
(Clj only) java.time.ZoneOffset
(defaults to UTC).
Note that zone may be ignored by some DateTimeFormatter
s,
including the default (DateTimeFormatter/ISO_INSTANT
)!
Experimental, subject to change without notice. Returns a (fn format [instant]) that: - Takes a platform instant (`java.time.Instant` or `js/Date`). - Returns a formatted human-readable instant string. Options: `:formatter` Clj: `java.time.format.DateTimeFormatter` Cljs: `goog.i18n.DateTimeFormat` Defaults to `ISO8601` formatter (`YYYY-MM-DDTHH:mm:ss.sssZ`), e.g.: "2011-12-03T10:15:130Z". `:zone` (Clj only) `java.time.ZoneOffset` (defaults to UTC). Note that zone may be ignored by some `DateTimeFormatter`s, including the default (`DateTimeFormatter/ISO_INSTANT`)!
(format-nsecs nanosecs)
Returns given nanoseconds (long) as formatted human-readable string. Example outputs: "1.00m", "4.20s", "340ms", "822μs", etc.
Returns given nanoseconds (long) as formatted human-readable string. Example outputs: "1.00m", "4.20s", "340ms", "822μs", etc.
(format-query-string m)
(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
.
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* 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
.
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 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.
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* 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:
Avoids unnecessary evaluation of not-found
.
Useful when not-found
is expensive or contains side-effects.
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)
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 {:keys [as default return] :or {as :str return :value}} spec)
Flexible cross-platform environmental value util.
Given a compile-time id (keyword/string) or vector of desc-priority ids, parse and return the first of the following that exists, or nil:
Ids may include optional platform tag for auto replacement, e.g.:
<.platform>
-> ".clj", ".cljs", or nil
Clj/s: if resulting value is a single symbol, it will be evaluated. Cljs: resulting value will be embedded in code during macro expansion!
Options:
:as
- Parse encountered 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
).
Use :explain
to verify/debug, handy for tests/REPL!
Example: (get-env {:as :edn} [:my-app/id1<.platform> :my-app/id2]) will parse and return the first of the following that exists, or nil:
id1 with platform:
`my-app.id1.clj` JVM property value
`MY_APP_id1_CLJ` environment variable value
`my-app.id1.clj` classpath resource content
id1 without platform:
`my-app.id1` JVM property value
`MY_APP_id1` environment variable value
`my-app.id1` classpath resource content
id2 with platform: ...
id2 without platform: ...
Flexible cross-platform environmental value util. Given a compile-time id (keyword/string) or vector of desc-priority ids, parse and return the first of the following that exists, or nil: 1. JVM property value for id 2. Environment variable value for id 3. Classpath resource content for id Ids may include optional platform tag for auto replacement, e.g.: `<.platform>` -> ".clj", ".cljs", or nil Clj/s: if resulting value is a single symbol, it will be evaluated. Cljs: resulting value will be embedded in code during macro expansion! Options: `:as` - Parse encountered 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`). Use `:explain` to verify/debug, handy for tests/REPL! Example: (get-env {:as :edn} [:my-app/id1<.platform> :my-app/id2]) will parse and return the first of the following that exists, or nil: id1 with platform: `my-app.id1.clj` JVM property value `MY_APP_id1_CLJ` environment variable value `my-app.id1.clj` classpath resource content id1 without platform: `my-app.id1` JVM property value `MY_APP_id1` environment variable value `my-app.id1` classpath resource content id2 with platform: ... id2 without platform: ...
(get-file-resource-?last-modified rname)
Returns last-modified time for file backing given named resource, or nil if file doesn't exist.
Returns last-modified time for file backing given named resource, or nil if file doesn't exist.
(get-in* m ks)
(get-in* m ks not-found)
Private, don't use this. Micro-optimized macro version of core/get-in
.
Avoids unnecessary evaluation of not-found
.
Private, don't use this. Micro-optimized macro version of `core/get-in`. Avoids unnecessary evaluation of `not-found`.
(get-pom-version dep-sym)
Returns POM version string for given Maven dependency, or nil.
Returns POM version string for given Maven dependency, or nil.
(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
.
Returns {:keys [ns line column file]} source location given a macro's compile-time `&form` and `&env` vals. See also `keep-callsite`.
(get-win-loc)
Returns current window location as {:keys [href protocol hostname host pathname search hash]}.
Returns current window location as {:keys [href protocol hostname host pathname search hash]}.
(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*
.
Like `get` but returns val for first key that exists in map. Useful for key aliases or fallbacks. See also `get*`.
Is clojure.core.async
present (not necessarily loaded)?
Is `clojure.core.async` present (not necessarily loaded)?
(hex-ident-str obj)
Returns hex string of given Object's identityHashCode
(e.g. "5eeb49f2").
Returns hex string of given Object's `identityHashCode` (e.g. "5eeb49f2").
(hex-str->ba s)
Returns hex string for given byte[].
Returns hex string for given byte[].
(host-info)
(host-info fallback-val)
(host-info timeout-msecs fallback-val)
(host-info cache-msecs 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.
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)
(host-ip fallback-val)
(host-ip timeout-msecs fallback-val)
(host-ip cache-msecs 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.
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)
(hostname fallback-val)
(hostname timeout-msecs fallback-val)
(hostname cache-msecs 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.
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.
(ident? x)
(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)
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 then & [else])
(if-cljs then & [else])
(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])
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 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.
Supersets `core/if-not` functionality. Same as `encore/if-let` with `then` `and `else` forms swapped.
(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])
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])
(indexed? x)
(inst->udt inst)
Returns given java.time.Instant
as milliseconds since Unix epoch.
Returns given `java.time.Instant` as milliseconds since Unix epoch.
Returns given js/Date
as milliseconds since Unix epoch.
Returns given `js/Date` as milliseconds since Unix epoch.
(inst? x)
Returns true iff given platform instant (java.time.Instant
or js/Date
).
Returns true iff given platform instant (`java.time.Instant` or `js/Date`).
(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 ex-info.
If (instance? class arg) is true, returns arg. Otherwise throws runtime ex-info.
(int? x)
Returns true iff given a number (of standard type) that is: a fixed-precision integer.
Returns true iff given a number (of standard type) that is: a fixed-precision integer.
(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).
Like `interleave` but includes all items (i.e. stops when the longest rather than shortest coll has been consumed).
(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.
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! 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.
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 to from)
(into-all to from & more)
Like into
but supports multiple "from"s.
Like `into` but supports multiple "from"s.
(into-str & xs)
Simple Hiccup-like string templating to complement Tempura.
Simple Hiccup-like string templating to complement Tempura.
(invert-map m)
Returns given ?map with keys and vals inverted, dropping non-unique vals!
Returns given ?map with keys and vals inverted, dropping non-unique vals!
(invert-map! m)
Like invert-map
but throws on non-unique vals.
Like `invert-map` but throws on non-unique vals.
(tf-cancel! _)
Returns true iff the timeout was successfully cancelled (i.e. was previously pending).
Returns true iff the timeout was successfully cancelled (i.e. was previously pending).
(tf-cancelled? _)
Returns true iff the timeout is cancelled.
Returns true iff the timeout is cancelled.
(tf-done? _)
Returns true iff the timeout is not pending (i.e. has a completed result or is cancelled).
Returns true iff the timeout is not pending (i.e. has a completed result or is cancelled).
(tf-pending? _)
Returns true iff the timeout is pending.
Returns true iff the timeout is pending.
(tf-poll _)
Returns :timeout/pending, :timeout/cancelled, or the timeout's completed result.
Returns :timeout/pending, :timeout/cancelled, or the timeout's completed result.
(tf-state _)
Returns a map of timeout's public state.
Returns a map of timeout's public state.
(-schedule-timeout _ msecs f)
(java-version)
(java-version version-string)
Returns Java's major version integer (8, 17, etc.).
Returns Java's major version integer (8, 17, etc.).
(java-version>= n)
Returns true iff Java's major version integer is >= given integer: (if (java-version>= 21) <then> <else>)
Returns true iff Java's major version integer is >= given integer: (if (java-version>= 21) <then> <else>)
(keys-by f coll)
Returns {(f x) x} ?map for xs in coll
.
Returns {(f x) x} ?map for xs in `coll`.
(ks-nnil? ks m)
(ks<= ks m)
(ks= ks m)
(ks>= ks m)
(lazy-seq? x)
(logf fmt & xs)
(logp & xs)
(map-entry k v)
Returns a MapEntry
with given key and value.
Returns a `MapEntry` with given key and value.
(map-keys key-fn m)
Returns given ?map with (key-fn <key>) keys.
Returns given ?map with (key-fn <key>) keys.
(map-vals val-fn m)
Returns given ?map with (val-fn <val>) vals.
Returns given ?map with (val-fn <val>) vals.
(mapply f & args)
Like apply
but calls seq-kvs
on final arg.
Like `apply` but calls `seq-kvs` on final arg.
(max* n1 n2)
(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.
Alternative way to call `cache`, provided mostly for back compatibility. See `cache` docstring for details.
(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.
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)
(merge m1)
(merge m1 m2)
(merge m1 m2 m3)
(merge m1 m2 m3 & more)
Like core/merge
but:
:merge/dissoc
vals.Like `core/merge` but: - Supports `:merge/dissoc` vals. - Often faster, with much better worst-case performance.
(merge-meta x m)
(merge-nx)
(merge-nx m1)
(merge-nx m1 m2)
(merge-nx m1 m2 m3)
(merge-nx m1 m2 m3 & more)
Like core/merge
but:
:merge/dissoc
vals.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 url m)
(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:
:merge/dissoc
vals.Like `core/merge-with` but: - Supports `:merge/dissoc` vals. - Often faster, with much better worst-case performance.
(min* n1 n2)
(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.
Returns ~number of milliseconds in period defined by given args.
(ms->secs ms)
(msecs opts)
(msecs & {:as opts :keys [years months weeks days hours mins secs msecs ms]})
Macro version of ms
.
Macro version of `ms`.
(name-filter spec)
Given filter spec
, returns a compiled (fn match? [x]) that:
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.*"}}.
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 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
.
Given a symbol and args, returns [<name-with-attrs-meta> <args> <attrs>] with support for `defn` style `?docstring` and `?attrs-map`.
(nameable? x)
(named? x)
(nanoid)
(nanoid len)
(nanoid secure? len)
(nanoid)
(nanoid len)
(nanoid prefer-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
.
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? x)
(nat-int? x)
(nat-num? x)
(nblank-str? x)
(nblank? x)
(neg-float? x)
(neg-int? x)
(neg-num? x)
(nempty-str? x)
(nested-merge)
(nested-merge m1)
(nested-merge m1 m2)
(nested-merge m1 m2 m3)
(nested-merge m1 m2 m3 & more)
Like core/merge
but:
:merge/dissoc
vals.Like `core/merge` but: - Recursively merges nested maps. - Supports `:merge/dissoc` vals. - Often faster, with much better worst-case performance.
(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:
:merge/dissoc
vals.Like `core/merge-with` but: - Recursively merges nested maps. - Supports `:merge/dissoc` vals. - Often faster, with much better worst-case performance.
(new-object)
(nneg? x)
(nnil)
(nnil x)
(nnil x y)
(nnil x y z)
(nnil x y z & more)
Returns first non-nil arg, or nil.
Returns first non-nil arg, or nil.
(norm-str s)
(norm-str norm-form s)
Returns normalized form of given string.
norm-form
is ∈ #{:nfc :nfkc :nfd :nfkd} (default :nfc
as per W3C).
Returns normalized form of given string. `norm-form` is ∈ #{:nfc :nfkc :nfd :nfkd} (default `:nfc` as per W3C).
(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.
Converts all word breaks of any form and length (including line breaks of any form, tabs, spaces, etc.) to a single regular space.
(normalize-headers rreq-or-rresp)
(not-empty-coll x)
(now-dt)
Returns current system instant as java.util.Date
.
Returns current system instant as `java.util.Date`.
Returns current system instant as js/Date
.
Returns current system instant as `js/Date`.
(now-inst)
Returns current system instant as java.time.Instant
.
Returns current system instant as `java.time.Instant`.
Returns current system instant as js/Date
.
Returns current system instant as `js/Date`.
(now-nano)
Returns current value of best-resolution time source as nanoseconds.
Returns current value of best-resolution time source as nanoseconds.
(now-udt)
Returns current system instant as milliseconds since Unix epoch.
Returns current system instant as milliseconds since Unix epoch.
Returns current system insant as milliseconds since Unix epoch.
Returns current system insant as milliseconds since Unix epoch.
(nzero-num? x)
(oget k)
(oget o k)
(oget o k not-found)
Like get
for JS objects.
Like `get` for JS objects.
(oget-in ks)
(oget-in o ks)
(oget-in o ks not-found)
Like get-in
for JS objects.
Like `get-in` for JS objects.
(oset-in o ks v)
Experimental, subject to change without notice.
Like assoc-in
for JS objects.
Experimental, subject to change without notice. Like `assoc-in` for JS objects.
(parse-js-int s)
(parse-query-params s & [keywordize? encoding])
Based on ring-codec/form-decode
.
Based on `ring-codec/form-decode`.
(parse-version x)
(path & parts)
(perc n divisor)
(pnum-complement pnum)
(pnum? x)
Returns true iff given number in unsigned unit proportion interval ∈ℝ[0,1].
Returns true iff given number in unsigned unit proportion interval ∈ℝ[0,1].
(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.
Experimental, subject to change without notice! Returns new `java.util.concurrent.ThreadPoolExecutor` with given opts.
(pos-float? x)
(pos-int? x)
(pos-num? x)
(pow n exp)
(pr & args)
Like core/pr
but faster, and atomic (avoids interleaved content from different threads).
Like `core/pr` but faster, and atomic (avoids interleaved content from different threads).
Identical to core/pr
.
Identical to `core/pr`.
(pr-edn x)
Prints given arg to an edn string readable with read-edn
.
Prints given arg to an edn string readable with `read-edn`.
(pr-json x)
Returns given Cljs argument as JSON string.
Returns given Cljs argument as JSON string.
(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.
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.
(preserve-reduced rf)
Public version of core/preserving-reduced
.
Public version of `core/preserving-reduced`.
(print & args)
Like core/print
but faster, and atomic (avoids interleaved content from different threads).
Like `core/print` but faster, and atomic (avoids interleaved content from different threads).
Identical to core/print
.
Identical to `core/print`.
(println & args)
Like core/println
but faster, and atomic (avoids interleaved content from different threads).
Like `core/println` but faster, and atomic (avoids interleaved content from different threads).
Identical to core/println
.
Identical to `core/println`.
(prn & args)
Like core/prn
but faster, and atomic (avoids interleaved content from different threads).
Like `core/prn` but faster, and atomic (avoids interleaved content from different threads).
Identical to core/prn
.
Identical to `core/prn`.
(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 {}]
Removes and returns value mapped to key: (let [a (atom {:k :v})] [(pull-val! a :k) @a]) => [:v {}]
(qb spec form)
(qb spec form & more)
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]
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? x)
(qualified-keyword? x)
(qualified-symbol? x)
(queue)
(queue coll)
Returns a new PersistentQueue
.
Returns a new `PersistentQueue`.
(queue* & items)
Returns a new PersistentQueue
given items.
Returns a new `PersistentQueue` given items.
(queue? x)
Returns true iff given a PersistentQueue
.
Returns true iff given a `PersistentQueue`.
(quick-bench spec form)
(quick-bench spec form & more)
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]
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 secure? size)
(rand-bytes prefer-secure? size)
Returns a random byte array of given size.
Returns a random byte array of given size.
(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
.
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 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:
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
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
(re-pattern? x)
(read-edn s)
(read-edn {:keys [readers default]
:as opts
:or {readers clojure.core/*data-readers*
default clojure.core/*default-data-reader-fn*}})
(read-edn s)
(read-edn {:keys [readers default]
:as opts
:or {readers (clojure.core/deref cljs.reader/*tag-table*)
default (clojure.core/deref
cljs.reader/*default-data-reader-fn*)}})
Reads given edn string to return a Clj/s value.
Reads given edn string to return a Clj/s value.
(read-json s)
(read-json kw-keys? s)
Reads given JSON string to return a Cljs value.
Reads given JSON string to return a Cljs value.
(reassoc-some m m-kvs)
(reassoc-some m k v)
(reassoc-some m k v & kvs)
Assocs each kv to given ?map if its value is nil, otherwise dissocs it.
Assocs each kv to given ?map if its value is nil, otherwise dissocs it.
(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.
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 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]
Reduces sequence of elements interleaved from given `colls`. (reduce-interleave-all conj [] [[:a :b] [1 2 3]]) => [:a 1 :b 2 3]
(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.
Reduces given `java.util.Iterator`, mutating it. Note that most colls providing iterators implement `java.lang.Iterable`, so support `seq` directly.
(reduce-kvs rf init kvs)
Like reduce-kv
but takes a flat sequence of kv pairs.
Like `reduce-kv` but takes a flat sequence of kv pairs.
(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.
Like `reduce` but supports separate simultaneous accumulators as a micro-optimization when reducing a large collection multiple times.
(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 ...)).
No longer useful with Clojure 1.7+, just use (reduce f init (range ...)).
(reduce-obj f init o)
Like reduce-kv
but for JavaScript objects.
Like `reduce-kv` but for JavaScript objects.
(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 ...)).
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 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
.
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 key-pred m)
Returns given ?map, removing keys for which (key-pred <key>) is truthy.
Returns given ?map, removing keys for which (key-pred <key>) is truthy.
(remove-vals val-pred m)
Returns given ?map, removing keys for which (val-pred <val>) is truthy.
Returns given ?map, removing keys for which (val-pred <val>) is truthy.
(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)).
Returns a map like the one given, replacing keys using given {<old-new> <new-key>} replacements. O(min(n_replacements, n_m)).
(repeatedly-into coll n f)
Like repeatedly
but faster and conj
s items into given collection.
Like `repeatedly` but faster and `conj`s items into given collection.
(reset!? atom_ val)
Atomically swaps value of atom_
to val
and returns
true iff the atom's value changed. See also reset-in!?
.
Atomically swaps value of `atom_` to `val` and returns true iff the atom's value changed. See also `reset-in!?`.
(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>.
Like `reset!` but supports `update-in` semantics, returns <old-key-val>.
(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.
Like `reset-in!` but returns true iff the atom's value changed.
(reset-val! atom_ k val)
(reset-val! atom_ k not-found val)
Like reset-in!
but optimized for single-key case. Returns <old-key-val>.
Like `reset-in!` but optimized for single-key case. Returns <old-key-val>.
(reset-val!? atom_ k new-val)
(reset-val!? atom_ k not-found new-val)
Like reset-in!?
but optimized for single-key case.
Returns true iff the atom's value changed.
Like `reset-in!?` but optimized for single-key case. Returns true iff the atom's value changed.
(revery-kv? pred coll)
Returns true iff (pred k v) is truthy for every kv in associative coll.
Returns true iff (pred k v) is truthy for every kv in associative coll.
(revery? pred coll)
(revery? xform pred coll)
Returns true iff (pred x) is truthy for every x in coll.
Like core/every?
but faster and supports transducers.
Returns true iff (pred x) is truthy for every x in coll. Like `core/every?` but faster and supports transducers.
(rfirst pred coll)
(rfirst xform pred coll)
Returns nil, or first x in coll with truthy (pred x).
Returns nil, or first x in coll with truthy (pred x).
(rfirst-kv pred coll)
Returns nil, or first [k v] entry in associative coll with truthy (pred k v).
Returns nil, or first [k v] entry in associative coll with truthy (pred k v).
(ring-default-headers headers rresp)
(ring-merge-headers headers rresp)
(ring-redirect-resp url)
(ring-redirect-resp kind url)
(ring-redirect-resp kind url flash)
(ring-resp-map x)
(ring-set-body body rresp)
(ring-set-headers headers rresp)
(ring-set-status code rresp)
(rnum? x)
Returns true iff given number in signed unit proportion interval ∈ℝ[-1,1].
Returns true iff given number in signed unit proportion interval ∈ℝ[-1,1].
(rolling-counter msecs)
Experimental, subject to change without notice. Returns a RollingCounter that you can:
msecs
window and return RollingCounter.msecs
window.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 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
.
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 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).
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 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)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)
(round0 n)
(round1 n)
(round2 n)
(round3 n)
(round4 n)
(roundn precision n)
(rsome pred coll)
(rsome xform pred coll)
Returns nil, or first truthy (pred x) for x in coll.
Like core/some
but faster and supports transducers.
Returns nil, or first truthy (pred x) for x in coll. Like `core/some` but faster and supports transducers.
(rsome-kv pred coll)
Returns nil, or first truthy (pred k v) for kv in associative coll.
Like core/some
but faster and takes kvs.
Returns nil, or first truthy (pred k v) for kv in associative coll. Like `core/some` but faster and takes kvs.
(run! proc coll)
(run-kv! proc m)
(run-kvs! proc kvs)
(run-obj! proc obj)
(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:
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.
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! 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 ex-info.
If (satisfies? protocol arg) is true, returns arg. Otherwise throws runtime ex-info.
(satisfies? protocol x)
Faster satisfies?
to work around CLJ-1814 until a proper upstream fix.
May cache, so possibly inappropriate for dynamic work.
Faster `satisfies?` to work around CLJ-1814 until a proper upstream fix. May cache, so possibly inappropriate for dynamic work.
(sayf fmt & xs)
(sayp & xs)
(sb-append str-builder x)
(sb-append str-builder x & more)
Appends given string/s to given string builder. See also str-builder.
Appends given string/s to given string builder. See also `str-builder.`
(sb-length sb)
Returns given string builder's current length (character count).
Returns given string builder's current length (character count).
(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.
Returns ~number of seconds in period defined by given args.
(secs->ms secs)
(secure-rng)
Returns an auto-reseeding thread-local java.security.SecureRandom
.
Favours security over performance. May block while waiting on entropy!
Returns an auto-reseeding thread-local `java.security.SecureRandom`. Favours security over performance. May block while waiting on entropy!
(secure-rng-mock!!! long-seed)
Returns INSECURE java.security.SecureRandom
mock instance backed by
a seeded deterministic java.util.Random
. Useful for testing, etc.
Returns **INSECURE** `java.security.SecureRandom` mock instance backed by a seeded deterministic `java.util.Random`. Useful for testing, etc.
(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.
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.
(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).
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! 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!
.
Sets root binding (value) of the var identified by given symbol, and returns the new value. Cross-platform. See also `update-var-root!`.
(simple-date-format pattern & [{:keys [locale timezone] :as opts}])
Returns a thread-local java.text.SimpleDateFormat
.
Returns a thread-local `java.text.SimpleDateFormat`.
(simple-date-format* pattern locale timezone)
(simple-ident? x)
(simple-keyword? x)
(simple-symbol? x)
Like slurp-resource
but caches slurps against file's last-modified udt.
Like `slurp-resource` but caches slurps against file's last-modified udt.
(slurp-resource rname)
Returns slurped named resource on classpath, or nil when resource not found.
Returns slurped named resource on classpath, or nil when resource not found.
(some= x)
(some= x y)
(some= x y & more)
Returns true iff given args are equal AND non-nil.
Returns true iff given args are equal AND non-nil.
(sortv coll)
(sortv comparator coll)
(sortv ?keyfn comparator coll)
Like core/sort
but:
comparator
can be :asc
, :desc
, or an arbitrary comparator.keyfn
may be provided, as in core/sort-by
.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 s)
Returns given String encoded as a UTF-8 byte[].
Returns given String encoded as a UTF-8 byte[].
(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.
Returns (first/last) ?index of substring if it exists within given string.
(str-builder)
(str-builder init)
Returns a new stateful string builder:
java.lang.StringBuilder
for Cljgoog.string.StringBuffer
for CljsSee also sb-append
.
Returns a new stateful string builder: - `java.lang.StringBuilder` for Clj - `goog.string.StringBuffer` for Cljs See also `sb-append`.
(str-builder? x)
(str-contains? s substr)
(str-ends-with? s substr)
(str-join xs)
(str-join separator xs)
(str-join separator xform xs)
Faster generalization of clojure.string/join
with transducer support.
Faster generalization of `clojure.string/join` with transducer support.
(str-join-once separator coll)
Like string/join
but skips nils and duplicate separators.
Like `string/join` but skips nils and duplicate separators.
(str-replace s match replacement)
Like str/replace
but provides consistent Clj/s behaviour.
Workaround for http://dev.clojure.org/jira/browse/CLJS-794, http://dev.clojure.org/jira/browse/CLJS-911.
Note that ClojureScript 1.7.145 introduced a partial fix for CLJS-911. A full fix could unfortunately not be introduced w/o breaking compatibility with the previously incorrect behaviour. CLJS-794 also remains unresolved.
Like `str/replace` but provides consistent Clj/s behaviour. Workaround for <http://dev.clojure.org/jira/browse/CLJS-794>, <http://dev.clojure.org/jira/browse/CLJS-911>. Note that ClojureScript 1.7.145 introduced a partial fix for CLJS-911. A full fix could unfortunately not be introduced w/o breaking compatibility with the previously incorrect behaviour. CLJS-794 also remains unresolved.
(str-rf)
(str-rf acc)
(str-rf acc in)
String builder reducing fn.
String builder reducing fn.
(str-starts-with? s substr)
(stringy? x)
(submap? super-map sub-map)
Returns true iff sub-map
is a (possibly nested) submap of super-map
,
i.e. iff every (nested) value in sub-map
has the same (nested) value in super-map
.
sub-map
may contain special values:
:submap/nx
- Matches iff super-map
does not contain key
:submap/ex
- Matches iff super-map
does contain key (any val)
:submap/some
- Matches iff super-map
does contain key (non-nil val)
(fn [super-val]) - Matches iff given unary predicate returns truthy
Uses stack recursion so supports only limited nesting.
Returns true iff `sub-map` is a (possibly nested) submap of `super-map`, i.e. iff every (nested) value in `sub-map` has the same (nested) value in `super-map`. `sub-map` may contain special values: `:submap/nx` - Matches iff `super-map` does not contain key `:submap/ex` - Matches iff `super-map` does contain key (any val) `:submap/some` - Matches iff `super-map` does contain key (non-nil val) (fn [super-val]) - Matches iff given unary predicate returns truthy Uses stack recursion so supports only limited nesting.
(submaps? maps subs)
Experimental, subject to change without notice.
Returns true iff sub_i
is a (possibly nested) submap of m_i
.
Uses submap?
.
Experimental, subject to change without notice. Returns true iff `sub_i` is a (possibly nested) submap of `m_i`. Uses `submap?`.
(substr s start-idx)
(substr s start-idx end-idx)
(substr s :by-len start end)
Returns a non-empty sub-string, or nil.
Like subs
but:
:by-len
kind (4-arity case):
start
may be -ive (=> index from right of string).end
is desired string length, or :max
.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 v start-idx)
(subvec v start-idx end-idx)
(subvec v :by-len start end)
Returns a non-empty sub-vector, or nil.
Like core/subvec
but:
:by-len
kind (4-arity case):
start
may be -ive (=> index from right of vector).end
is desired vector length, or :max
.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! 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
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! atom_ k f)
(swap-val! atom_ k not-found f)
Like swap-in!
but optimized for single-key case.
Returns <new-key-val> or <swapped-return-val>:
(swap-val! (atom {:k 5}) :k inc) => 6
(swap-val! (atom {:k 5}) :k
(fn [old] (swapped (inc old) old))) => 5
Like `swap-in!` but optimized for single-key case. Returns <new-key-val> or <swapped-return-val>: (swap-val! (atom {:k 5}) :k inc) => 6 (swap-val! (atom {:k 5}) :k (fn [old] (swapped (inc old) old))) => 5
(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.
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? x)
Returns true iff given Swapped
argument.
Returns true iff given `Swapped` argument.
(takev n coll)
(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))
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)
Returns long id of current Thread
.
Returns long id of current `Thread`.
(thread-info)
Returns {:keys [group name id]} for current Thread
.
Returns {:keys [group name id]} for current `Thread`.
(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!
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* init-val-fn)
Low-level, see thread-local
instead.
Low-level, see `thread-local` instead.
(thread-local-proxy & body)
Low-level, see thread-local
instead.
Low-level, see `thread-local` instead.
(thread-name)
Returns string name of current Thread
.
Returns string name of current `Thread`.
(throwable? x)
(time-ms & body)
Returns number of milliseconds it took to execute body.
Returns number of milliseconds it took to execute body.
(time-ns & body)
Returns number of nanoseconds it took to execute body.
Returns number of nanoseconds it took to execute body.
(timeout-future? x)
(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
.
Returns a sorted vector of the top `n` items from `coll` using `reduce-top`.
(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
.
Conjoins the top `n` items from `coll` into `to` using `reduce-top`.
(transient? x)
(udt->inst msecs-since-epoch)
Returns given milliseconds since Unix epoch as java.time.Instant
.
Returns given milliseconds since Unix epoch as `java.time.Instant`.
Returns given milliseconds since Unix epoch as js/Date
.
Returns given milliseconds since Unix epoch as `js/Date`.
(udt? x)
(update! m k f)
(update-in m ks f)
(update-in m ks not-found f)
Like core/update-in
but:.
not-found
.:update/dissoc
, :update/abort
.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! 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!
.
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!`.
(uri? x)
(url-decode s & [encoding])
Stolen from http://goo.gl/99NSR1.
Stolen from <http://goo.gl/99NSR1>.
(url-encode s & [encoding])
(url-encode s)
Based on https://goo.gl/fBqy6e.
Based on <https://goo.gl/fBqy6e>.
(utf8-ba->str ba)
Returns String by decoding given UTF-8 byte[].
Returns String by decoding given UTF-8 byte[].
(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
.
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)
(uuid-str max-len)
Returns a random UUID string of given length (max 36).
Uses strong randomness when possible. See also uuid
, nanoid
, rand-id-fn
.
Returns a random UUID string of given length (max 36). Uses strong randomness when possible. See also `uuid`, `nanoid`, `rand-id-fn`.
(vec2? x)
(vec3? x)
(vinterleave-all colls)
(vinterleave-all c1 c2)
(vinterleave-all c1 c2 c3)
(vinterleave-all c1 c2 c3 & colls)
Like interleave
, but:
Single-arity version takes a coll of 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)
Experimental, subject to change without notice!
Returns new virtual java.util.concurrent.ThreadPerTaskExecutor
when
possible (JVM 21+), otherwise returns nil.
Experimental, subject to change without notice! Returns new virtual `java.util.concurrent.ThreadPerTaskExecutor` when possible (JVM 21+), otherwise returns nil.
(vnext v)
(vrest v)
(vsplit-first v)
(vsplit-last v)
(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
.
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 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])
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 test-or-bindings & body)
Supersets core/when-not
functionality.
Same as encore/if-let
with body
as else
form.
Supersets `core/when-not` functionality. Same as `encore/if-let` with `body` as `else` form.
(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])
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])
(without-meta x)
(xdistinct)
(xdistinct keyfn)
Returns a stateful transducer like (core/distinct) that supports an optional key function. Retains only items with distinct (keyfn <item>).
Returns a stateful transducer like (core/distinct) that supports an optional key function. Retains only items with distinct (keyfn <item>).
(zero-num? x)
cljdoc is a website building & hosting documentation for Clojure/Script libraries
× close