Skip to content
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
Cannot retrieve contributors at this time
(ns todomvc.transact
"Contains functions for manipulating the application data through DataScript"
(:require [datascript :as d]
[cljs-uuid-utils :as uuid]))
(defn log-event [db event & args]
(let [evente {:db/id -100
:event event
:args args}]
(if-let [prev-event-eid (ffirst (d/q '{:find [?e]
:where [[?e :last-event]]}
[(assoc evente :prev-event prev-event-eid)
[:db.fn/retractAttribute prev-event-eid :last-event]]
(defn set-filter [db this-filter]
[[:db.fn/call log-event :set-filter this-filter]
(let [e (ffirst (d/q '{:find [?e]
:where [[?e :filter]]}
[:db/add e :filter this-filter])])
(defn seed-item [db id text completed]
[[:db.fn/call log-event :seed-item id text completed]
{:db/id -1
:id id
:text text
:completed completed
:commited true}])
(defn remove-item [db id]
[[:db.fn/call log-event :remove-item id]
(let [e (ffirst (d/q '{:find [?e]
:in [$ ?id]
:where [[?e :id ?id]]}
db id))]
[:db.fn/retractEntity e])])
(defn clear-completed [db]
(let [eids+ids (d/q '{:find [?e ?id]
:where [[?e :completed true]
[?e :id ?id]]}
(into [[:db.fn/call log-event :clear-completed (map second eids+ids)]]
(for [e (map first eids+ids)]
[:db.fn/retractEntity e]))))
(defn toggle-item
;; Given an application state, toggle the completion status of the
;; item with the specified ID
[db id]
(let [[e completed] (first (d/q '{:find [?e ?completed]
:in [$ ?id]
:where [[?e :id ?id]
[?e :completed ?completed]]}
db id))
completed (not completed)]
[[:db.fn/call log-event :toggle-item id completed]
[:db/add e :completed completed]]))
(defn toggle-all [db]
(let [e+id+completed (d/q '{:find [?e ?id ?completed]
:where [[?e :id ?id]
[?e :completed ?completed]]}
target (not (every? (fn [[_ _ completed]] completed) e+id+completed))]
(into [[:db.fn/call log-event :toggle-all]]
(for [[e id completed] e+id+completed
:when (= completed (not target))]
[:db/add e :completed target]))))
(defn error [db msg]
[[:db.fn/call log-event :error msg]
{:db/id -1
:error msg}])
(defn create-item [db text]
(let [temp-id (uuid/make-random-uuid)]
[[:db.fn/call log-event :create-item temp-id text]
{:db/id -1
:id temp-id
:commited false
:completed false
:text text}]))
(defn commit-item [db temp-id id]
[[:db.fn/call log-event :commit-item temp-id id]
(let [e (ffirst (d/q '{:find [?e]
:in [$ ?id]
:where [[?e :id ?id]]}
db temp-id))]
{:db/id e :id id :commited true})])
(defn start-edit [db id]
[[:db.fn/call log-event :start-edit id]
(let [e (ffirst (d/q '{:find [?e]
:in [$ ?id]
:where [[?e :id ?id]]}
db id))]
[:db/add e :editing true])])
(defn complete-edit [db id text]
(into [[:db.fn/call log-event :complete-edit id text]]
(let [e (ffirst (d/q '{:find [?e]
:in [$ ?id]
:where [[?e :id ?id]]}
db id))]
[[:db/add e :editing false]
[:db/add e :commited false]
[:db/add e :text text]])))
(defn commit-edit [db id]
[[:db.fn/call log-event :commit-edit id]
(let [e (ffirst (d/q '{:find [?e]
:in [$ ?id]
:where [[?e :id ?id]]}
db id))]
[:db/add e :commited true])])