Skip to content

Instantly share code, notes, and snippets.

@mrrodriguez
mrrodriguez / clara-batched-updates.clj
Created January 4, 2024 17:25
Externally batching and updating the working memory state
(defrecord PrevFetchedItems [item-ids])
(defrecord ToFetch [items])
(r/defrule find-items-to-fetch
[PrevFetchedItems (= ?item-ids item-ids)]
[?items <- (acc/all) :from [Item (not (contains? ?items id))]]
=>
(r/insert! (->ToFetch ?items)))
(r/defquery get-items-to-fetch []
@mrrodriguez
mrrodriguez / clara-logical-loop.situation.clj
Last active September 24, 2021 13:00
Clara-rules typical logical loop
;; Usually the solution is to reframe the problem you have in a way that avoids the logical contradiction,
;; ie. 'not B => B'
;; and continue to use the default inserts (not unconditional type) that participate in truth maintenance
;; To avoid a rule like this:
(r/defrule b-contradiction
[A]
[:not [B]]
=>
(r/insert! (->B))
@mrrodriguez
mrrodriguez / failures.clj
Created May 3, 2019 19:09
Using `clojure.core/eval` at CLJS macroexpansion-time
#error {
:cause "Unable to resolve symbol: bar in this context"
:via
[{:type clojure.lang.ExceptionInfo
:message "failed compiling file:src/example/foo.cljs"
:data {:file #object[java.io.File 0x2766fb87 "src/example/foo.cljs"]}
:at [clojure.core$ex_info invokeStatic "core.clj" 4739]}
{:type clojure.lang.ExceptionInfo
:message "java.lang.RuntimeException: Unable to resolve symbol: bar in this context, compiling:(*thing*:6:9) at line 6 src/example/foo.cljs"
:data {:file "src/example/foo.cljs", :line 6, :column 1, :tag :cljs/analysis-error}
@mrrodriguez
mrrodriguez / reagent-fix-cursor-jump.cljs
Created November 26, 2018 18:43
Reagent input cursor jumping
;;;; Dealing with jumping cursors on controlled input (a classic React/Reagent problem).
;;;; For rationale see
;;;; https://github.com/reagent-project/reagent/issues/265#issuecomment-397895508
;;;; &
;;;; https://github.com/reagent-project/reagent/blob/e53be656073af9209c4fe8bc9119635953311d42/examples/material-ui/src/example/core.cljs#L34
;; In the ns header...
(:require [reagent.core :as r]
[reagent.impl.template :as template])
@mrrodriguez
mrrodriguez / clara_tiered_fact_update_rules.clj
Last active July 1, 2020 18:07
Clara tiered fact update rules
(require '[clara.rules :as r])
;;;; Define 3 rules, where the "priority" order is r1, r2, r3, where the highest priority is first
;;;; and the rest is in descending order of priority.
;;;; :type :rule/result "syntetic" fact is used to hold the final changes that can be queried out
;;;; from a session after `r/fire-rules` via `r/query` on the `find-results` query.
;;;; A namespace qualified keyword is used to avoid collision with externally given :type of
;;;; "real" facts.
@mrrodriguez
mrrodriguez / clj-data-fressian-serde.clj
Last active May 10, 2023 15:46
Clojure Serialization With Fressian
;;;; Fressian dependency used in these examples
;; [org.clojure/data.fressian "0.2.1"]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; Using only `org.clojure/data.fressian`
(require '[clojure.data.fressian :as fres])
(defn serde-obj
@mrrodriguez
mrrodriguez / unindexing_durability.clj
Created August 19, 2016 18:56
Back when clara.rules.durability had the concept of "unindex"ing memory - was removed for efficiency
(ns clara.rules.durability
"Experimental namespace. This may change non-passively without warning.
Support for persisting Clara sessions to an external store.
See the serialize-session-state function to retrieve the full state of a session as a data structure that can
be easily serialized via EDN or Fressian. Sessions can then be recovered with the restore-session-state function.
TODO: diff support is pending -- functions for obtaining a diff of state from a previous point, allowing for a write-ahead log."
(:require [clara.rules :refer :all]
@mrrodriguez
mrrodriguez / print_method.clj
Last active August 24, 2016 16:10
print-method based clara-rules durability impl
(ns clara.rules.durability.print-method
(:require [clara.rules.durability :as d]
[clara.rules.memory :as mem]
[clara.rules.engine :as eng]
[clara.rules.compiler :as com]
[clojure.java.io :as jio]
[clojure.main :as cm])
(:import [clara.rules.durability
MemIdx]
[clara.rules.memory
@mrrodriguez
mrrodriguez / gist:e2138f220a9aa7eacc20
Created May 6, 2014 18:56
Comparing clj record ctor options performance
(defrecord MyTest [a b c d e f g h i j])
;= user.MyTest
(time (dotimes [_ 10000000]
(new MyTest 1 2 3 4 5 6 7 8 9 10)))
;= "Elapsed time: 11.227 msecs"
;= nil
(time (dotimes [_ 10000000]
(->MyTest 1 2 3 4 5 6 7 8 9 10)))
package example.drools;
public class Utils {
public static Boolean useless(final Object... os) {
System.out.println("here");
return true;
}
public static Boolean useless1(final Object... os) {
System.out.println("here");
return true;