@anysoftinc/anydb-sdk
Version:
AnyDB TypeScript SDK for querying and transacting with Datomic databases
1,286 lines (1,135 loc) • 48.1 kB
JavaScript
var $CLJS = require("./cljs_env");
var $jscomp = $CLJS.$jscomp;
var COMPILED = false;
require("./cljs.core.js");
require("./cljs.reader.js");
require("./datascript.conn.js");
require("./datascript.db.js");
require("./datascript.pull_api.js");
require("./datascript.serialize.js");
require("./datascript.storage.js");
require("./datascript.query.js");
require("./datascript.impl.entity.js");
require("./datascript.util.js");
require("./me.tonsky.persistent_sorted_set.js");
var anydb=$CLJS.anydb || ($CLJS.anydb = {});
var clojure=$CLJS.clojure || ($CLJS.clojure = {});
var cljs=$CLJS.cljs || ($CLJS.cljs = {});
var goog=$CLJS.goog || ($CLJS.goog = {});
var datascript=$CLJS.datascript || ($CLJS.datascript = {});
var me=$CLJS.me || ($CLJS.me = {});
var extend_clj=$CLJS.extend_clj || ($CLJS.extend_clj = {});
$CLJS.SHADOW_ENV.setLoaded("datascript.core.js");
goog.provide('datascript.core');
datascript.core.tx0 = (536870912);
/**
* Retrieves an entity by its id from database. Entities are lazy map-like structures to navigate DataScript database content.
*
* For `eid` pass entity id or lookup attr:
*
* (entity db 1)
* (entity db [:unique-attr :value])
*
* If entity does not exist, `nil` is returned:
*
* (entity db 100500) ; => nil
*
* Creating an entity by id is very cheap, almost no-op, as attr access is on-demand:
*
* (entity db 1) ; => {:db/id 1}
*
* Entity attributes can be lazily accessed through key lookups:
*
* (:attr (entity db 1)) ; => :value
* (get (entity db 1) :attr) ; => :value
*
* Cardinality many attributes are returned sequences:
*
* (:attrs (entity db 1)) ; => [:v1 :v2 :v3]
*
* Reference attributes are returned as another entities:
*
* (:ref (entity db 1)) ; => {:db/id 2}
* (:ns/ref (entity db 1)) ; => {:db/id 2}
*
* References can be walked backwards by prepending `_` to name part of an attribute:
*
* (:_ref (entity db 2)) ; => [{:db/id 1}]
* (:ns/_ref (entity db 2)) ; => [{:db/id 1}]
*
* Reverse reference lookup returns sequence of entities unless attribute is marked as `:db/isComponent`:
*
* (:_component-ref (entity db 2)) ; => {:db/id 1}
*
* Entity gotchas:
*
* - Entities print as map, but are not exactly maps (they have compatible get interface though).
* - Entities are effectively immutable “views” into a particular version of a database.
* - Entities retain reference to the whole database.
* - You can’t change database through entities, only read.
* - Creating an entity by id is very cheap, almost no-op (attributes are looked up on demand).
* - Comparing entities just compares their ids. Be careful when comparing entities taken from different dbs or from different versions of the same db.
* - Accessed entity attributes are cached on entity itself (except backward references).
* - When printing, only cached attributes (the ones you have accessed before) are printed. See [[touch]].
*/
datascript.core.entity = datascript.impl.entity.entity;
/**
* Given lookup ref `[unique-attr value]`, returns numberic entity id.
*
* If entity does not exist, returns `nil`.
*/
datascript.core.entid = datascript.db.entid;
/**
* Returns a db that entity was created from.
*/
datascript.core.entity_db = (function datascript$core$entity_db(entity){
if(datascript.impl.entity.entity_QMARK_(entity)){
} else {
throw (new Error("Assert failed: (de/entity? entity)"));
}
return entity.db;
});
/**
* Forces all entity attributes to be eagerly fetched and cached. Only usable for debug output.
*
* Usage:
*
* ```
* (entity db 1) ; => {:db/id 1}
* (touch (entity db 1)) ; => {:db/id 1, :dislikes [:pie], :likes [:pizza]}
* ```
*/
datascript.core.touch = datascript.impl.entity.touch;
/**
* Fetches data from database using recursive declarative description. See [docs.datomic.com/on-prem/pull.html](https://docs.datomic.com/on-prem/pull.html).
*
* Unlike [[entity]], returns plain Clojure map (not lazy).
*
* Usage:
*
* (pull db [:db/id, :name, :likes, {:friends [:db/id :name]}] 1)
* ; => {:db/id 1,
* ; :name "Ivan"
* ; :likes [:pizza]
* ; :friends [{:db/id 2, :name "Oleg"}]}
*/
datascript.core.pull = datascript.pull_api.pull;
/**
* Same as [[pull]], but accepts sequence of ids and returns sequence of maps.
*
* Usage:
*
* ```
* (pull-many db [:db/id :name] [1 2])
* ; => [{:db/id 1, :name "Ivan"}
* ; {:db/id 2, :name "Oleg"}]
* ```
*/
datascript.core.pull_many = datascript.pull_api.pull_many;
/**
* Executes a datalog query. See [docs.datomic.com/on-prem/query.html](https://docs.datomic.com/on-prem/query.html).
*
* Usage:
*
* ```
* (q '[:find ?value
* :where [_ :likes ?value]]
* db)
* ; => #{["fries"] ["candy"] ["pie"] ["pizza"]}
* ```
*/
datascript.core.q = datascript.query.q;
/**
* Creates an empty database with an optional schema.
*
* Usage:
*
* ```
* (empty-db) ; => #datascript/DB {:schema {}, :datoms []}
*
* (empty-db {:likes {:db/cardinality :db.cardinality/many}})
* ; => #datascript/DB {:schema {:likes {:db/cardinality :db.cardinality/many}}
* ; :datoms []}
* ```
*
* Options are:
*
* :branching-factor <int>, default 512. B-tree max node length
* :ref-type :strong | :soft | :weak, default :soft. How will nodes that are already
* stored on disk be referenced. Soft or weak means they might be unloaded
* from memory under memory pressure and later fetched from storage again.
* :storage <IStorage>. Will be used to store this db later with `(d/store db)`
*/
datascript.core.empty_db = (function datascript$core$empty_db(var_args){
var G__15084 = arguments.length;
switch (G__15084) {
case 0:
return datascript.core.empty_db.cljs$core$IFn$_invoke$arity$0();
break;
case 1:
return datascript.core.empty_db.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
break;
case 2:
return datascript.core.empty_db.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
break;
default:
throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
}
});
(datascript.core.empty_db.cljs$core$IFn$_invoke$arity$0 = (function (){
return datascript.db.empty_db(null,cljs.core.PersistentArrayMap.EMPTY);
}));
(datascript.core.empty_db.cljs$core$IFn$_invoke$arity$1 = (function (schema){
return datascript.db.empty_db(schema,cljs.core.PersistentArrayMap.EMPTY);
}));
(datascript.core.empty_db.cljs$core$IFn$_invoke$arity$2 = (function (schema,opts){
return datascript.db.empty_db(schema,datascript.storage.maybe_adapt_storage(opts));
}));
(datascript.core.empty_db.cljs$lang$maxFixedArity = 2);
/**
* Returns `true` if the given value is an immutable database, `false` otherwise.
*/
datascript.core.db_QMARK_ = datascript.db.db_QMARK_;
/**
* Low-level fn to create raw datoms.
*
* Optionally with transaction id (number) and `added` flag (`true` for addition, `false` for retraction).
*
* See also [[init-db]].
*/
datascript.core.datom = datascript.db.datom;
/**
* Returns `true` if the given value is a datom, `false` otherwise.
*/
datascript.core.datom_QMARK_ = datascript.db.datom_QMARK_;
/**
* Low-level fn for creating database quickly from a trusted sequence of datoms.
* Does no validation on inputs, so `datoms` must be well-formed and match schema.
* Used internally in db (de)serialization. See also [[datom]].
* For options, see [[empty-db]]
*/
datascript.core.init_db = (function datascript$core$init_db(var_args){
var G__15087 = arguments.length;
switch (G__15087) {
case 1:
return datascript.core.init_db.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
break;
case 2:
return datascript.core.init_db.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
break;
case 3:
return datascript.core.init_db.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
break;
default:
throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
}
});
(datascript.core.init_db.cljs$core$IFn$_invoke$arity$1 = (function (datoms){
return datascript.db.init_db(datoms,null,cljs.core.PersistentArrayMap.EMPTY);
}));
(datascript.core.init_db.cljs$core$IFn$_invoke$arity$2 = (function (datoms,schema){
return datascript.db.init_db(datoms,schema,cljs.core.PersistentArrayMap.EMPTY);
}));
(datascript.core.init_db.cljs$core$IFn$_invoke$arity$3 = (function (datoms,schema,opts){
return datascript.db.init_db(datoms,schema,datascript.storage.maybe_adapt_storage(opts));
}));
(datascript.core.init_db.cljs$lang$maxFixedArity = 3);
/**
* Converts db into a data structure (not string!) that can be fed to serializer
* of your choice (e.g. `js/JSON.stringify` in CLJS, `cheshire.core/generate-string`
* or `jsonista.core/write-value-as-string` in CLJ).
*
* On JVM, `serializable` holds a global lock that prevents any two serializations
* to run in parallel (an implementation constraint, be aware).
*
* Options:
*
* `:freeze-fn` Non-primitive values will be serialized using this. Optional.
* `pr-str` by default.
*/
datascript.core.serializable = datascript.serialize.serializable;
/**
* Creates db from a data structure (not string!) produced by serializable.
*
* Opts:
*
* `:thaw-fn` Non-primitive values will be deserialized using this.
* Must match :freeze-fn from serializable. Optional. `clojure.edn/read-string`
* by default.
*/
datascript.core.from_serializable = datascript.serialize.from_serializable;
/**
* Returns a schema of a database.
*/
datascript.core.schema = datascript.db._schema;
/**
* Returns `true` if this database was filtered using [[filter]], `false` otherwise.
*/
datascript.core.is_filtered = (function datascript$core$is_filtered(x){
return (x instanceof datascript.db.FilteredDB);
});
/**
* Returns a view over database that has same interface but only includes datoms for which the `(pred db datom)` is true. Can be applied multiple times.
*
* Filtered DB gotchas:
*
* - All operations on filtered database are proxied to original DB, then filter pred is applied.
* - Not cached. You pay filter penalty every time.
* - Supports entities, pull, queries, index access.
* - Does not support [[with]] and [[db-with]].
*/
datascript.core.filter = (function datascript$core$filter(db,pred){
if(datascript.db.db_QMARK_(db)){
} else {
throw (new Error("Assert failed: (db/db? db)"));
}
if(datascript.core.is_filtered(db)){
var fdb = db;
var orig_pred = fdb.pred;
var orig_db = fdb.unfiltered_db;
return (new datascript.db.FilteredDB(orig_db,(function (p1__15095_SHARP_){
var and__5000__auto__ = (orig_pred.cljs$core$IFn$_invoke$arity$1 ? orig_pred.cljs$core$IFn$_invoke$arity$1(p1__15095_SHARP_) : orig_pred.call(null,p1__15095_SHARP_));
if(cljs.core.truth_(and__5000__auto__)){
return (pred.cljs$core$IFn$_invoke$arity$2 ? pred.cljs$core$IFn$_invoke$arity$2(orig_db,p1__15095_SHARP_) : pred.call(null,orig_db,p1__15095_SHARP_));
} else {
return and__5000__auto__;
}
}),cljs.core.atom.cljs$core$IFn$_invoke$arity$1((0)),null,null,null));
} else {
return (new datascript.db.FilteredDB(db,(function (p1__15096_SHARP_){
return (pred.cljs$core$IFn$_invoke$arity$2 ? pred.cljs$core$IFn$_invoke$arity$2(db,p1__15096_SHARP_) : pred.call(null,db,p1__15096_SHARP_));
}),cljs.core.atom.cljs$core$IFn$_invoke$arity$1((0)),null,null,null));
}
});
/**
* Same as [[transact!]], but applies to an immutable database value. Returns transaction report (see [[transact!]]).
*/
datascript.core.with$ = datascript.conn.with$;
/**
* Applies transaction to an immutable db value, returning new immutable db value. Same as `(:db-after (with db tx-data))`.
*/
datascript.core.db_with = datascript.conn.db_with;
/**
* Warning! No validation or conversion. Only change schema in a compatible way
*/
datascript.core.with_schema = (function datascript$core$with_schema(db,schema){
return datascript.db.with_schema(db,schema);
});
/**
* Index lookup. Returns a sequence of datoms (lazy iterator over actual DB index) which components (e, a, v) match passed arguments.
*
* Datoms are sorted in index sort order. Possible `index` values are: `:eavt`, `:aevt`, `:avet`.
*
* Usage:
*
* ; find all datoms for entity id == 1 (any attrs and values)
* ; sort by attribute, then value
* (datoms db :eavt 1)
* ; => (#datascript/Datom [1 :friends 2]
* ; #datascript/Datom [1 :likes "fries"]
* ; #datascript/Datom [1 :likes "pizza"]
* ; #datascript/Datom [1 :name "Ivan"])
*
* ; find all datoms for entity id == 1 and attribute == :likes (any values)
* ; sorted by value
* (datoms db :eavt 1 :likes)
* ; => (#datascript/Datom [1 :likes "fries"]
* ; #datascript/Datom [1 :likes "pizza"])
*
* ; find all datoms for entity id == 1, attribute == :likes and value == "pizza"
* (datoms db :eavt 1 :likes "pizza")
* ; => (#datascript/Datom [1 :likes "pizza"])
*
* ; find all datoms for attribute == :likes (any entity ids and values)
* ; sorted by entity id, then value
* (datoms db :aevt :likes)
* ; => (#datascript/Datom [1 :likes "fries"]
* ; #datascript/Datom [1 :likes "pizza"]
* ; #datascript/Datom [2 :likes "candy"]
* ; #datascript/Datom [2 :likes "pie"]
* ; #datascript/Datom [2 :likes "pizza"])
*
* ; find all datoms that have attribute == `:likes` and value == `"pizza"` (any entity id)
* ; `:likes` must be a unique attr, reference or marked as `:db/index true`
* (datoms db :avet :likes "pizza")
* ; => (#datascript/Datom [1 :likes "pizza"]
* ; #datascript/Datom [2 :likes "pizza"])
*
* ; find all datoms sorted by entity id, then attribute, then value
* (datoms db :eavt) ; => (...)
*
* Useful patterns:
*
* ; get all values of :db.cardinality/many attribute
* (->> (datoms db :eavt eid attr) (map :v))
*
* ; lookup entity ids by attribute value
* (->> (datoms db :avet attr value) (map :e))
*
* ; find all entities with a specific attribute
* (->> (datoms db :aevt attr) (map :e))
*
* ; find “singleton” entity by its attr
* (->> (datoms db :aevt attr) first :e)
*
* ; find N entities with lowest attr value (e.g. 10 earliest posts)
* (->> (datoms db :avet attr) (take N))
*
* ; find N entities with highest attr value (e.g. 10 latest posts)
* (->> (datoms db :avet attr) (reverse) (take N))
*
* Gotchas:
*
* - Index lookup is usually more efficient than doing a query with a single clause.
* - Resulting iterator is calculated in constant time and small constant memory overhead.
* - Iterator supports efficient `first`, `next`, `reverse`, `seq` and is itself a sequence.
* - Will not return datoms that are not part of the index (e.g. attributes with no `:db/index` in schema when querying `:avet` index).
* - `:eavt` and `:aevt` contain all datoms.
* - `:avet` only contains datoms for references, `:db/unique` and `:db/index` attributes.
*/
datascript.core.datoms = (function datascript$core$datoms(var_args){
var G__15105 = arguments.length;
switch (G__15105) {
case 2:
return datascript.core.datoms.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
break;
case 3:
return datascript.core.datoms.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
break;
case 4:
return datascript.core.datoms.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
break;
case 5:
return datascript.core.datoms.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
break;
case 6:
return datascript.core.datoms.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
break;
default:
throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
}
});
(datascript.core.datoms.cljs$core$IFn$_invoke$arity$2 = (function (db,index){
if(datascript.db.db_QMARK_(db)){
} else {
throw (new Error("Assert failed: (db/db? db)"));
}
return datascript.db._datoms(db,index,null,null,null,null);
}));
(datascript.core.datoms.cljs$core$IFn$_invoke$arity$3 = (function (db,index,c0){
if(datascript.db.db_QMARK_(db)){
} else {
throw (new Error("Assert failed: (db/db? db)"));
}
return datascript.db._datoms(db,index,c0,null,null,null);
}));
(datascript.core.datoms.cljs$core$IFn$_invoke$arity$4 = (function (db,index,c0,c1){
if(datascript.db.db_QMARK_(db)){
} else {
throw (new Error("Assert failed: (db/db? db)"));
}
return datascript.db._datoms(db,index,c0,c1,null,null);
}));
(datascript.core.datoms.cljs$core$IFn$_invoke$arity$5 = (function (db,index,c0,c1,c2){
if(datascript.db.db_QMARK_(db)){
} else {
throw (new Error("Assert failed: (db/db? db)"));
}
return datascript.db._datoms(db,index,c0,c1,c2,null);
}));
(datascript.core.datoms.cljs$core$IFn$_invoke$arity$6 = (function (db,index,c0,c1,c2,c3){
if(datascript.db.db_QMARK_(db)){
} else {
throw (new Error("Assert failed: (db/db? db)"));
}
return datascript.db._datoms(db,index,c0,c1,c2,c3);
}));
(datascript.core.datoms.cljs$lang$maxFixedArity = 6);
/**
* Same as [[datoms]], but only returns single datom. Faster than `(first (datoms ...))`
*/
datascript.core.find_datom = (function datascript$core$find_datom(var_args){
var G__15133 = arguments.length;
switch (G__15133) {
case 2:
return datascript.core.find_datom.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
break;
case 3:
return datascript.core.find_datom.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
break;
case 4:
return datascript.core.find_datom.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
break;
case 5:
return datascript.core.find_datom.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
break;
case 6:
return datascript.core.find_datom.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
break;
default:
throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
}
});
(datascript.core.find_datom.cljs$core$IFn$_invoke$arity$2 = (function (db,index){
if(datascript.db.db_QMARK_(db)){
} else {
throw (new Error("Assert failed: (db/db? db)"));
}
return datascript.db.find_datom(db,index,null,null,null,null);
}));
(datascript.core.find_datom.cljs$core$IFn$_invoke$arity$3 = (function (db,index,c0){
if(datascript.db.db_QMARK_(db)){
} else {
throw (new Error("Assert failed: (db/db? db)"));
}
return datascript.db.find_datom(db,index,c0,null,null,null);
}));
(datascript.core.find_datom.cljs$core$IFn$_invoke$arity$4 = (function (db,index,c0,c1){
if(datascript.db.db_QMARK_(db)){
} else {
throw (new Error("Assert failed: (db/db? db)"));
}
return datascript.db.find_datom(db,index,c0,c1,null,null);
}));
(datascript.core.find_datom.cljs$core$IFn$_invoke$arity$5 = (function (db,index,c0,c1,c2){
if(datascript.db.db_QMARK_(db)){
} else {
throw (new Error("Assert failed: (db/db? db)"));
}
return datascript.db.find_datom(db,index,c0,c1,c2,null);
}));
(datascript.core.find_datom.cljs$core$IFn$_invoke$arity$6 = (function (db,index,c0,c1,c2,c3){
if(datascript.db.db_QMARK_(db)){
} else {
throw (new Error("Assert failed: (db/db? db)"));
}
return datascript.db.find_datom(db,index,c0,c1,c2,c3);
}));
(datascript.core.find_datom.cljs$lang$maxFixedArity = 6);
/**
* Similar to [[datoms]], but will return datoms starting from specified components and including rest of the database until the end of the index.
*
* If no datom matches passed arguments exactly, iterator will start from first datom that could be considered “greater” in index order.
*
* Usage:
*
* (seek-datoms db :eavt 1)
* ; => (#datascript/Datom [1 :friends 2]
* ; #datascript/Datom [1 :likes "fries"]
* ; #datascript/Datom [1 :likes "pizza"]
* ; #datascript/Datom [1 :name "Ivan"]
* ; #datascript/Datom [2 :likes "candy"]
* ; #datascript/Datom [2 :likes "pie"]
* ; #datascript/Datom [2 :likes "pizza"])
*
* (seek-datoms db :eavt 1 :name)
* ; => (#datascript/Datom [1 :name "Ivan"]
* ; #datascript/Datom [2 :likes "candy"]
* ; #datascript/Datom [2 :likes "pie"]
* ; #datascript/Datom [2 :likes "pizza"])
*
* (seek-datoms db :eavt 2)
* ; => (#datascript/Datom [2 :likes "candy"]
* ; #datascript/Datom [2 :likes "pie"]
* ; #datascript/Datom [2 :likes "pizza"])
*
* ; no datom [2 :likes "fish"], so starts with one immediately following such in index
* (seek-datoms db :eavt 2 :likes "fish")
* ; => (#datascript/Datom [2 :likes "pie"]
* ; #datascript/Datom [2 :likes "pizza"])
*/
datascript.core.seek_datoms = (function datascript$core$seek_datoms(var_args){
var G__15136 = arguments.length;
switch (G__15136) {
case 2:
return datascript.core.seek_datoms.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
break;
case 3:
return datascript.core.seek_datoms.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
break;
case 4:
return datascript.core.seek_datoms.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
break;
case 5:
return datascript.core.seek_datoms.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
break;
case 6:
return datascript.core.seek_datoms.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
break;
default:
throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
}
});
(datascript.core.seek_datoms.cljs$core$IFn$_invoke$arity$2 = (function (db,index){
if(datascript.db.db_QMARK_(db)){
} else {
throw (new Error("Assert failed: (db/db? db)"));
}
return datascript.db._seek_datoms(db,index,null,null,null,null);
}));
(datascript.core.seek_datoms.cljs$core$IFn$_invoke$arity$3 = (function (db,index,c0){
if(datascript.db.db_QMARK_(db)){
} else {
throw (new Error("Assert failed: (db/db? db)"));
}
return datascript.db._seek_datoms(db,index,c0,null,null,null);
}));
(datascript.core.seek_datoms.cljs$core$IFn$_invoke$arity$4 = (function (db,index,c0,c1){
if(datascript.db.db_QMARK_(db)){
} else {
throw (new Error("Assert failed: (db/db? db)"));
}
return datascript.db._seek_datoms(db,index,c0,c1,null,null);
}));
(datascript.core.seek_datoms.cljs$core$IFn$_invoke$arity$5 = (function (db,index,c0,c1,c2){
if(datascript.db.db_QMARK_(db)){
} else {
throw (new Error("Assert failed: (db/db? db)"));
}
return datascript.db._seek_datoms(db,index,c0,c1,c2,null);
}));
(datascript.core.seek_datoms.cljs$core$IFn$_invoke$arity$6 = (function (db,index,c0,c1,c2,c3){
if(datascript.db.db_QMARK_(db)){
} else {
throw (new Error("Assert failed: (db/db? db)"));
}
return datascript.db._seek_datoms(db,index,c0,c1,c2,c3);
}));
(datascript.core.seek_datoms.cljs$lang$maxFixedArity = 6);
/**
* Same as [[seek-datoms]], but goes backwards until the beginning of the index.
*/
datascript.core.rseek_datoms = (function datascript$core$rseek_datoms(var_args){
var G__15139 = arguments.length;
switch (G__15139) {
case 2:
return datascript.core.rseek_datoms.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
break;
case 3:
return datascript.core.rseek_datoms.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
break;
case 4:
return datascript.core.rseek_datoms.cljs$core$IFn$_invoke$arity$4((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]));
break;
case 5:
return datascript.core.rseek_datoms.cljs$core$IFn$_invoke$arity$5((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]));
break;
case 6:
return datascript.core.rseek_datoms.cljs$core$IFn$_invoke$arity$6((arguments[(0)]),(arguments[(1)]),(arguments[(2)]),(arguments[(3)]),(arguments[(4)]),(arguments[(5)]));
break;
default:
throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
}
});
(datascript.core.rseek_datoms.cljs$core$IFn$_invoke$arity$2 = (function (db,index){
if(datascript.db.db_QMARK_(db)){
} else {
throw (new Error("Assert failed: (db/db? db)"));
}
return datascript.db._rseek_datoms(db,index,null,null,null,null);
}));
(datascript.core.rseek_datoms.cljs$core$IFn$_invoke$arity$3 = (function (db,index,c0){
if(datascript.db.db_QMARK_(db)){
} else {
throw (new Error("Assert failed: (db/db? db)"));
}
return datascript.db._rseek_datoms(db,index,c0,null,null,null);
}));
(datascript.core.rseek_datoms.cljs$core$IFn$_invoke$arity$4 = (function (db,index,c0,c1){
if(datascript.db.db_QMARK_(db)){
} else {
throw (new Error("Assert failed: (db/db? db)"));
}
return datascript.db._rseek_datoms(db,index,c0,c1,null,null);
}));
(datascript.core.rseek_datoms.cljs$core$IFn$_invoke$arity$5 = (function (db,index,c0,c1,c2){
if(datascript.db.db_QMARK_(db)){
} else {
throw (new Error("Assert failed: (db/db? db)"));
}
return datascript.db._rseek_datoms(db,index,c0,c1,c2,null);
}));
(datascript.core.rseek_datoms.cljs$core$IFn$_invoke$arity$6 = (function (db,index,c0,c1,c2,c3){
if(datascript.db.db_QMARK_(db)){
} else {
throw (new Error("Assert failed: (db/db? db)"));
}
return datascript.db._rseek_datoms(db,index,c0,c1,c2,c3);
}));
(datascript.core.rseek_datoms.cljs$lang$maxFixedArity = 6);
/**
* Returns part of `:avet` index between `[_ attr start]` and `[_ attr end]` in AVET sort order.
*
* Same properties as [[datoms]].
*
* `attr` must be a reference, unique attribute or marked as `:db/index true`.
*
* Usage:
*
* (index-range db :likes "a" "zzzzzzzzz")
* ; => (#datascript/Datom [2 :likes "candy"]
* ; #datascript/Datom [1 :likes "fries"]
* ; #datascript/Datom [2 :likes "pie"]
* ; #datascript/Datom [1 :likes "pizza"]
* ; #datascript/Datom [2 :likes "pizza"])
*
* (index-range db :likes "egg" "pineapple")
* ; => (#datascript/Datom [1 :likes "fries"]
* ; #datascript/Datom [2 :likes "pie"])
*
* Useful patterns:
*
* ; find all entities with age in a specific range (inclusive)
* (->> (index-range db :age 18 60) (map :e))
*/
datascript.core.index_range = (function datascript$core$index_range(db,attr,start,end){
if(datascript.db.db_QMARK_(db)){
} else {
throw (new Error("Assert failed: (db/db? db)"));
}
return datascript.db._index_range(db,attr,start,end);
});
/**
* Returns `true` if this is a connection to a DataScript db, `false` otherwise.
*/
datascript.core.conn_QMARK_ = datascript.conn.conn_QMARK_;
/**
* Creates a mutable reference to a given immutable database. See [[create-conn]].
*/
datascript.core.conn_from_db = datascript.conn.conn_from_db;
/**
* Creates an empty DB and a mutable reference to it. See [[create-conn]].
*/
datascript.core.conn_from_datoms = datascript.conn.conn_from_datoms;
/**
* Creates a mutable reference (a “connection”) to an empty immutable database.
*
* Connections are lightweight in-memory structures (~atoms) with direct support of transaction listeners ([[listen!]], [[unlisten!]]) and other handy DataScript APIs ([[transact!]], [[reset-conn!]], [[db]]).
*
* To access underlying immutable DB value, deref: `@conn`.
*
* For list of options, see [[empty-db]].
*
* If you specify `:storage` option, conn will be stored automatically after each transaction
*/
datascript.core.create_conn = datascript.conn.create_conn;
/**
* Applies transaction the underlying database value and atomically updates connection reference to point to the result of that transaction, new db value.
*
* Returns transaction report, a map:
*
* { :db-before ... ; db value before transaction
* :db-after ... ; db value after transaction
* :tx-data [...] ; plain datoms that were added/retracted from db-before
* :tempids {...} ; map of tempid from tx-data => assigned entid in db-after
* :tx-meta tx-meta } ; the exact value you passed as `tx-meta`
*
* Note! `conn` will be updated in-place and is not returned from [[transact!]].
*
* Usage:
*
* ; add a single datom to an existing entity (1)
* (transact! conn [[:db/add 1 :name "Ivan"]])
*
* ; retract a single datom
* (transact! conn [[:db/retract 1 :name "Ivan"]])
*
* ; retract single entity attribute
* (transact! conn [[:db.fn/retractAttribute 1 :name]])
*
* ; ... or equivalently (since Datomic changed its API to support this):
* (transact! conn [[:db/retract 1 :name]])
*
* ; retract all entity attributes (effectively deletes entity)
* (transact! conn [[:db.fn/retractEntity 1]])
*
* ; create a new entity (`-1`, as any other negative value, is a tempid
* ; that will be replaced with DataScript to a next unused eid)
* (transact! conn [[:db/add -1 :name "Ivan"]])
*
* ; check assigned id (here `*1` is a result returned from previous `transact!` call)
* (def report *1)
* (:tempids report) ; => {-1 296}
*
* ; check actual datoms inserted
* (:tx-data report) ; => [#datascript/Datom [296 :name "Ivan"]]
*
* ; tempid can also be a string
* (transact! conn [[:db/add "ivan" :name "Ivan"]])
* (:tempids *1) ; => {"ivan" 297}
*
* ; reference another entity (must exist)
* (transact! conn [[:db/add -1 :friend 296]])
*
* ; create an entity and set multiple attributes (in a single transaction
* ; equal tempids will be replaced with the same yet unused entid)
* (transact! conn [[:db/add -1 :name "Ivan"]
* [:db/add -1 :likes "fries"]
* [:db/add -1 :likes "pizza"]
* [:db/add -1 :friend 296]])
*
* ; create an entity and set multiple attributes (alternative map form)
* (transact! conn [{:db/id -1
* :name "Ivan"
* :likes ["fries" "pizza"]
* :friend 296}])
*
* ; update an entity (alternative map form). Can’t retract attributes in
* ; map form. For cardinality many attrs, value (fish in this example)
* ; will be added to the list of existing values
* (transact! conn [{:db/id 296
* :name "Oleg"
* :likes ["fish"]}])
*
* ; ref attributes can be specified as nested map, that will create nested entity as well
* (transact! conn [{:db/id -1
* :name "Oleg"
* :friend {:db/id -2
* :name "Sergey"}}])
*
* ; reverse attribute name can be used if you want created entity to become
* ; a value in another entity reference
* (transact! conn [{:db/id -1
* :name "Oleg"
* :_friend 296}])
* ; equivalent to
* (transact! conn [{:db/id -1, :name "Oleg"}
* {:db/id 296, :friend -1}])
* ; equivalent to
* (transact! conn [[:db/add -1 :name "Oleg"]
* [:db/add 296 :friend -1]])
*/
datascript.core.transact_BANG_ = datascript.conn.transact_BANG_;
/**
* Forces underlying `conn` value to become `db`. Will generate a tx-report that will remove everything from old value and insert everything from the new one.
*/
datascript.core.reset_conn_BANG_ = datascript.conn.reset_conn_BANG_;
datascript.core.reset_schema_BANG_ = datascript.conn.reset_schema_BANG_;
/**
* Listen for changes on the given connection. Whenever a transaction is applied to the database via [[transact!]], the callback is called
* with the transaction report. `key` is any opaque unique value.
*
* Idempotent. Calling [[listen!]] with the same key twice will override old callback with the new value.
*
* Returns the key under which this listener is registered. See also [[unlisten!]].
*/
datascript.core.listen_BANG_ = datascript.conn.listen_BANG_;
/**
* Removes registered listener from connection. See also [[listen!]].
*/
datascript.core.unlisten_BANG_ = datascript.conn.unlisten_BANG_;
/**
* Data readers for EDN readers. In CLJS they’re registered automatically. In CLJ, if `data_readers.clj` do not work, you can always do
*
* ```
* (clojure.edn/read-string {:readers data-readers} "...")
* ```
*/
datascript.core.data_readers = new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Symbol("datascript","Datom","datascript/Datom",-901340080,null),datascript.db.datom_from_reader,new cljs.core.Symbol("datascript","DB","datascript/DB",-487332776,null),datascript.db.db_from_reader], null);
var seq__15148_15240 = cljs.core.seq(datascript.core.data_readers);
var chunk__15149_15241 = null;
var count__15150_15242 = (0);
var i__15151_15243 = (0);
while(true){
if((i__15151_15243 < count__15150_15242)){
var vec__15169_15244 = chunk__15149_15241.cljs$core$IIndexed$_nth$arity$2(null,i__15151_15243);
var tag_15245 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__15169_15244,(0),null);
var cb_15246 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__15169_15244,(1),null);
cljs.reader.register_tag_parser_BANG_(tag_15245,cb_15246);
var G__15247 = seq__15148_15240;
var G__15248 = chunk__15149_15241;
var G__15249 = count__15150_15242;
var G__15250 = (i__15151_15243 + (1));
seq__15148_15240 = G__15247;
chunk__15149_15241 = G__15248;
count__15150_15242 = G__15249;
i__15151_15243 = G__15250;
continue;
} else {
var temp__5804__auto___15251 = cljs.core.seq(seq__15148_15240);
if(temp__5804__auto___15251){
var seq__15148_15252__$1 = temp__5804__auto___15251;
if(cljs.core.chunked_seq_QMARK_(seq__15148_15252__$1)){
var c__5525__auto___15253 = cljs.core.chunk_first(seq__15148_15252__$1);
var G__15254 = cljs.core.chunk_rest(seq__15148_15252__$1);
var G__15255 = c__5525__auto___15253;
var G__15256 = cljs.core.count(c__5525__auto___15253);
var G__15257 = (0);
seq__15148_15240 = G__15254;
chunk__15149_15241 = G__15255;
count__15150_15242 = G__15256;
i__15151_15243 = G__15257;
continue;
} else {
var vec__15179_15261 = cljs.core.first(seq__15148_15252__$1);
var tag_15262 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__15179_15261,(0),null);
var cb_15263 = cljs.core.nth.cljs$core$IFn$_invoke$arity$3(vec__15179_15261,(1),null);
cljs.reader.register_tag_parser_BANG_(tag_15262,cb_15263);
var G__15267 = cljs.core.next(seq__15148_15252__$1);
var G__15268 = null;
var G__15269 = (0);
var G__15270 = (0);
seq__15148_15240 = G__15267;
chunk__15149_15241 = G__15268;
count__15150_15242 = G__15269;
i__15151_15243 = G__15270;
continue;
}
} else {
}
}
break;
}
datascript.core.last_tempid = cljs.core.atom.cljs$core$IFn$_invoke$arity$1((-1000000));
/**
* Allocates and returns an unique temporary id (a negative integer). Ignores `part`. Returns `x` if it is specified.
*
* Exists for Datomic API compatibility. Prefer using negative integers directly if possible.
*/
datascript.core.tempid = (function datascript$core$tempid(var_args){
var G__15183 = arguments.length;
switch (G__15183) {
case 1:
return datascript.core.tempid.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
break;
case 2:
return datascript.core.tempid.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
break;
default:
throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
}
});
(datascript.core.tempid.cljs$core$IFn$_invoke$arity$1 = (function (part){
if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(part,new cljs.core.Keyword("db.part","tx","db.part/tx",-1480923213))){
return new cljs.core.Keyword("db","current-tx","db/current-tx",1600722132);
} else {
return cljs.core.swap_BANG_.cljs$core$IFn$_invoke$arity$2(datascript.core.last_tempid,cljs.core.dec);
}
}));
(datascript.core.tempid.cljs$core$IFn$_invoke$arity$2 = (function (part,x){
if(cljs.core._EQ_.cljs$core$IFn$_invoke$arity$2(part,new cljs.core.Keyword("db.part","tx","db.part/tx",-1480923213))){
return new cljs.core.Keyword("db","current-tx","db/current-tx",1600722132);
} else {
return x;
}
}));
(datascript.core.tempid.cljs$lang$maxFixedArity = 2);
/**
* Does a lookup in tempids map, returning an entity id that tempid was resolved to.
*
* Exists for Datomic API compatibility. Prefer using map lookup directly if possible.
*/
datascript.core.resolve_tempid = (function datascript$core$resolve_tempid(_db,tempids,tempid){
return cljs.core.get.cljs$core$IFn$_invoke$arity$2(tempids,tempid);
});
/**
* Returns the underlying immutable database value from a connection.
*
* Exists for Datomic API compatibility. Prefer using `@conn` directly if possible.
*/
datascript.core.db = (function datascript$core$db(conn){
if(cljs.core.truth_((datascript.core.conn_QMARK_.cljs$core$IFn$_invoke$arity$1 ? datascript.core.conn_QMARK_.cljs$core$IFn$_invoke$arity$1(conn) : datascript.core.conn_QMARK_.call(null,conn)))){
} else {
throw (new Error("Assert failed: (conn? conn)"));
}
return cljs.core.deref(conn);
});
/**
* @constructor
* @implements {cljs.core.IDerefWithTimeout}
* @implements {cljs.core.IPending}
* @implements {cljs.core.IMeta}
* @implements {cljs.core.IDeref}
* @implements {cljs.core.IWithMeta}
*/
datascript.core.t_datascript$core15189 = (function (conn,tx_data,tx_meta,res,meta15190){
this.conn = conn;
this.tx_data = tx_data;
this.tx_meta = tx_meta;
this.res = res;
this.meta15190 = meta15190;
this.cljs$lang$protocol_mask$partition0$ = 491520;
this.cljs$lang$protocol_mask$partition1$ = 1;
});
(datascript.core.t_datascript$core15189.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (_15191,meta15190__$1){
var self__ = this;
var _15191__$1 = this;
return (new datascript.core.t_datascript$core15189(self__.conn,self__.tx_data,self__.tx_meta,self__.res,meta15190__$1));
}));
(datascript.core.t_datascript$core15189.prototype.cljs$core$IMeta$_meta$arity$1 = (function (_15191){
var self__ = this;
var _15191__$1 = this;
return self__.meta15190;
}));
(datascript.core.t_datascript$core15189.prototype.cljs$core$IDeref$_deref$arity$1 = (function (_){
var self__ = this;
var ___$1 = this;
return self__.res;
}));
(datascript.core.t_datascript$core15189.prototype.cljs$core$IDerefWithTimeout$_deref_with_timeout$arity$3 = (function (_,___$1,___$2){
var self__ = this;
var ___$3 = this;
return self__.res;
}));
(datascript.core.t_datascript$core15189.prototype.cljs$core$IPending$_realized_QMARK_$arity$1 = (function (_){
var self__ = this;
var ___$1 = this;
return true;
}));
(datascript.core.t_datascript$core15189.getBasis = (function (){
return new cljs.core.PersistentVector(null, 5, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"conn","conn",1918841190,null),new cljs.core.Symbol(null,"tx-data","tx-data",-1720276008,null),new cljs.core.Symbol(null,"tx-meta","tx-meta",-1495152575,null),new cljs.core.Symbol(null,"res","res",245523648,null),new cljs.core.Symbol(null,"meta15190","meta15190",-808423817,null)], null);
}));
(datascript.core.t_datascript$core15189.cljs$lang$type = true);
(datascript.core.t_datascript$core15189.cljs$lang$ctorStr = "datascript.core/t_datascript$core15189");
(datascript.core.t_datascript$core15189.cljs$lang$ctorPrWriter = (function (this__5287__auto__,writer__5288__auto__,opt__5289__auto__){
return cljs.core._write(writer__5288__auto__,"datascript.core/t_datascript$core15189");
}));
/**
* Positional factory function for datascript.core/t_datascript$core15189.
*/
datascript.core.__GT_t_datascript$core15189 = (function datascript$core$__GT_t_datascript$core15189(conn,tx_data,tx_meta,res,meta15190){
return (new datascript.core.t_datascript$core15189(conn,tx_data,tx_meta,res,meta15190));
});
/**
* Same as [[transact!]], but returns an immediately realized future.
*
* Exists for Datomic API compatibility. Prefer using [[transact!]] if possible.
*/
datascript.core.transact = (function datascript$core$transact(var_args){
var G__15187 = arguments.length;
switch (G__15187) {
case 2:
return datascript.core.transact.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
break;
case 3:
return datascript.core.transact.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
break;
default:
throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
}
});
(datascript.core.transact.cljs$core$IFn$_invoke$arity$2 = (function (conn,tx_data){
return datascript.core.transact.cljs$core$IFn$_invoke$arity$3(conn,tx_data,null);
}));
(datascript.core.transact.cljs$core$IFn$_invoke$arity$3 = (function (conn,tx_data,tx_meta){
if(cljs.core.truth_((datascript.core.conn_QMARK_.cljs$core$IFn$_invoke$arity$1 ? datascript.core.conn_QMARK_.cljs$core$IFn$_invoke$arity$1(conn) : datascript.core.conn_QMARK_.call(null,conn)))){
} else {
throw (new Error("Assert failed: (conn? conn)"));
}
var res = (datascript.core.transact_BANG_.cljs$core$IFn$_invoke$arity$3 ? datascript.core.transact_BANG_.cljs$core$IFn$_invoke$arity$3(conn,tx_data,tx_meta) : datascript.core.transact_BANG_.call(null,conn,tx_data,tx_meta));
return (new datascript.core.t_datascript$core15189(conn,tx_data,tx_meta,res,cljs.core.PersistentArrayMap.EMPTY));
}));
(datascript.core.transact.cljs$lang$maxFixedArity = 3);
/**
* @constructor
* @implements {cljs.core.IDerefWithTimeout}
* @implements {cljs.core.IPending}
* @implements {cljs.core.IMeta}
* @implements {cljs.core.IDeref}
* @implements {cljs.core.IWithMeta}
*/
datascript.core.t_datascript$core15193 = (function (f,res,realized,meta15194){
this.f = f;
this.res = res;
this.realized = realized;
this.meta15194 = meta15194;
this.cljs$lang$protocol_mask$partition0$ = 491520;
this.cljs$lang$protocol_mask$partition1$ = 1;
});
(datascript.core.t_datascript$core15193.prototype.cljs$core$IWithMeta$_with_meta$arity$2 = (function (_15195,meta15194__$1){
var self__ = this;
var _15195__$1 = this;
return (new datascript.core.t_datascript$core15193(self__.f,self__.res,self__.realized,meta15194__$1));
}));
(datascript.core.t_datascript$core15193.prototype.cljs$core$IMeta$_meta$arity$1 = (function (_15195){
var self__ = this;
var _15195__$1 = this;
return self__.meta15194;
}));
(datascript.core.t_datascript$core15193.prototype.cljs$core$IDeref$_deref$arity$1 = (function (_){
var self__ = this;
var ___$1 = this;
return cljs.core.deref(self__.res);
}));
(datascript.core.t_datascript$core15193.prototype.cljs$core$IDerefWithTimeout$_deref_with_timeout$arity$3 = (function (_,___$1,timeout_val){
var self__ = this;
var ___$2 = this;
if(cljs.core.truth_(cljs.core.deref(self__.realized))){
return cljs.core.deref(self__.res);
} else {
return timeout_val;
}
}));
(datascript.core.t_datascript$core15193.prototype.cljs$core$IPending$_realized_QMARK_$arity$1 = (function (_){
var self__ = this;
var ___$1 = this;
return cljs.core.deref(self__.realized);
}));
(datascript.core.t_datascript$core15193.getBasis = (function (){
return new cljs.core.PersistentVector(null, 4, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Symbol(null,"f","f",43394975,null),new cljs.core.Symbol(null,"res","res",245523648,null),new cljs.core.Symbol(null,"realized","realized",1487343404,null),new cljs.core.Symbol(null,"meta15194","meta15194",-1352265001,null)], null);
}));
(datascript.core.t_datascript$core15193.cljs$lang$type = true);
(datascript.core.t_datascript$core15193.cljs$lang$ctorStr = "datascript.core/t_datascript$core15193");
(datascript.core.t_datascript$core15193.cljs$lang$ctorPrWriter = (function (this__5287__auto__,writer__5288__auto__,opt__5289__auto__){
return cljs.core._write(writer__5288__auto__,"datascript.core/t_datascript$core15193");
}));
/**
* Positional factory function for datascript.core/t_datascript$core15193.
*/
datascript.core.__GT_t_datascript$core15193 = (function datascript$core$__GT_t_datascript$core15193(f,res,realized,meta15194){
return (new datascript.core.t_datascript$core15193(f,res,realized,meta15194));
});
datascript.core.future_call = (function datascript$core$future_call(f){
var res = cljs.core.atom.cljs$core$IFn$_invoke$arity$1(null);
var realized = cljs.core.atom.cljs$core$IFn$_invoke$arity$1(false);
setTimeout((function (){
cljs.core.reset_BANG_(res,(f.cljs$core$IFn$_invoke$arity$0 ? f.cljs$core$IFn$_invoke$arity$0() : f.call(null)));
return cljs.core.reset_BANG_(realized,true);
}),(0));
return (new datascript.core.t_datascript$core15193(f,res,realized,cljs.core.PersistentArrayMap.EMPTY));
});
/**
* In CLJ, calls [[transact!]] on a future thread pool, returning immediately.
*
* In CLJS, just calls [[transact!]] and returns a realized future.
*/
datascript.core.transact_async = (function datascript$core$transact_async(var_args){
var G__15198 = arguments.length;
switch (G__15198) {
case 2:
return datascript.core.transact_async.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
break;
case 3:
return datascript.core.transact_async.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
break;
default:
throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
}
});
(datascript.core.transact_async.cljs$core$IFn$_invoke$arity$2 = (function (conn,tx_data){
return datascript.core.transact_async.cljs$core$IFn$_invoke$arity$3(conn,tx_data,null);
}));
(datascript.core.transact_async.cljs$core$IFn$_invoke$arity$3 = (function (conn,tx_data,tx_meta){
if(cljs.core.truth_((datascript.core.conn_QMARK_.cljs$core$IFn$_invoke$arity$1 ? datascript.core.conn_QMARK_.cljs$core$IFn$_invoke$arity$1(conn) : datascript.core.conn_QMARK_.call(null,conn)))){
} else {
throw (new Error("Assert failed: (conn? conn)"));
}
return datascript.core.future_call((function (){
return (datascript.core.transact_BANG_.cljs$core$IFn$_invoke$arity$3 ? datascript.core.transact_BANG_.cljs$core$IFn$_invoke$arity$3(conn,tx_data,tx_meta) : datascript.core.transact_BANG_.call(null,conn,tx_data,tx_meta));
}));
}));
(datascript.core.transact_async.cljs$lang$maxFixedArity = 3);
/**
* Generates a UUID that grow with time. Such UUIDs will always go to the end of the index and that will minimize insertions in the middle.
*
* Consist of 64 bits of current UNIX timestamp (in seconds) and 64 random bits (2^64 different unique values per second).
*/
datascript.core.squuid = datascript.util.squuid;
/**
* Returns time that was used in [[squuid]] call, in milliseconds, rounded to the closest second.
*/
datascript.core.squuid_time_millis = datascript.util.squuid_time_millis;
datascript.core.settings = (function datascript$core$settings(db){
return me.tonsky.persistent_sorted_set.settings(new cljs.core.Keyword(null,"eavt","eavt",-666437073).cljs$core$IFn$_invoke$arity$1(db));
});
//# sourceMappingURL=datascript.core.js.map