Skip to content

Instantly share code, notes, and snippets.

@a2ndrade
Created May 25, 2013 23:00
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save a2ndrade/5651065 to your computer and use it in GitHub Desktop.
Save a2ndrade/5651065 to your computer and use it in GitHub Desktop.
Datomic: memoized predicate functions
;; see http://stackoverflow.com/questions/16386793/datomic-query-function-that-filters-and-binds
(require '[datomic.api :as d])
(def uri "datomic:mem://test")
(d/create-database uri)
(def conn (d/connect uri))
;; sample attribute definiton
(d/transact conn [{:db.install/_attribute :db.part/db
:db/id #db/id[:db.part/db]
:db/ident :user/regex-match
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one}])
;; sample data
(d/transact conn [{:db/id #db/id[:db.part/user] :user/regex-match "so 1"}
{:db/id #db/id[:db.part/user] :user/regex-match "no-match"}
{:db/id #db/id[:db.part/user] :user/regex-match "so 23"}
{:db/id #db/id[:db.part/user] :user/regex-match "no-match 2"}
{:db/id #db/id[:db.part/user] :user/regex-match "so 456"}])
(defn match? [m] (re-find (re-pattern "so (\\d+)") m))
(def fast-match? (memoize match?))
(->> (d/datoms (d/db conn) :aevt :user/regex-match)
(filter #(fast-match? (:v %)))
(map :v))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment