32 lines
1.1 KiB
Clojure
32 lines
1.1 KiB
Clojure
(ns emptyhead.thought.define
|
|
"Utilities for defining new thoughts."
|
|
(:require [emptyhead.thought.crud :as thought]
|
|
[emptyhead.thought.eval :as eval]
|
|
[emptyhead.idea.crud :as idea]))
|
|
|
|
(defn register-implementation!
|
|
[operator impl]
|
|
(idea/have-idea! :prefix (str "impl_thought_" (name operator))
|
|
:properties [[:thought-impl operator]]
|
|
:data {:implementation impl}))
|
|
|
|
(defn register-constructor!
|
|
[operator & {:keys [constr-fn defaults]
|
|
:or {constr-fn identity
|
|
defaults {}}}]
|
|
(let [constr-op (keyword (str (name operator) ".construct"))]
|
|
(register-implementation!
|
|
constr-op
|
|
(fn [thought & [parent]]
|
|
[parent
|
|
(thought/register-thought!
|
|
operator
|
|
(merge defaults {:operator operator}
|
|
(constr-fn (merge parent thought))))]))))
|
|
|
|
(defn define!
|
|
[operator impl & {:keys [constr-fn defaults]
|
|
:as constr-args}]
|
|
(register-implementation! operator impl)
|
|
(register-constructor! operator constr-args))
|