This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2020-06-22
Channels
- # babashka (36)
- # beginners (42)
- # calva (6)
- # chlorine-clover (25)
- # cider (31)
- # clara (5)
- # clj-kondo (55)
- # cljdoc (3)
- # cljs-dev (7)
- # cljsrn (3)
- # clojure (73)
- # clojure-brasil (6)
- # clojure-europe (8)
- # clojure-italy (2)
- # clojure-nl (3)
- # clojure-norway (1)
- # clojure-spec (3)
- # clojure-sweden (4)
- # clojure-switzerland (2)
- # clojure-uk (29)
- # clojurescript (93)
- # conjure (21)
- # data-science (14)
- # datomic (19)
- # emacs (4)
- # exercism (3)
- # figwheel-main (38)
- # fulcro (38)
- # graalvm (42)
- # graphql (5)
- # jackdaw (3)
- # jobs (1)
- # joker (2)
- # lambdaisland (1)
- # leiningen (31)
- # malli (8)
- # meander (5)
- # off-topic (27)
- # pathom (2)
- # pedestal (28)
- # re-frame (25)
- # reagent (2)
- # reitit (11)
- # releases (3)
- # remote-jobs (1)
- # rum (1)
- # shadow-cljs (63)
- # spacemacs (17)
- # sql (1)
Have you seen http://www.clara-rules.org/docs/fact_type_customization/? This would allow you to match on the ancestor type and just have the single accumulator.
Another option would be to leverage interfaces and allow the default ancestors function to handle it. Something like:
(ns test.interfaces
(:require [clara.rules :as r]
[clara.rules.accumulators :as acc]))
(definterface Summable
(^long amount []))
(defrecord RecordOne [x]
Summable
(amount [_] x))
(defrecord RecordTwo [y]
Summable
(amount [_] y))
(defrecord Sum [z])
(r/defrule sum-rule
[?s <- (acc/sum #(.amount ^Summable %)) :from [Summable]]
=>
(r/insert! (->Sum ?s)))
(r/defquery sum-query
[]
[?s <- Sum])
(defn run-test
[]
(-> (r/mk-session)
(r/insert (->RecordOne 1)
(->RecordOne 2)
(->RecordTwo 3)
(->RecordTwo 4))
(r/fire-rules)
(r/query sum-query)))
;; (run-test)
;; => ({:?s #test.interfaces.Sum{:z 10}})