Files
rose-ash/lib/relations/api.sx
giles 1c46fc2a69
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 31s
relations: shape queries (siblings, in/out-degree, undirected connected?) computed in SX + 18 tests
Keep the Datalog ruleset minimal — every dl-query re-saturates, so shape
queries are SX BFS over erel, not extra closures. 110/110.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:56:35 +00:00

103 lines
2.7 KiB
Plaintext

;; lib/relations/api.sx — relationship lifecycle + current-db convenience layer.
;;
;; A relations db is a live Datalog db holding rel(Src,Dst,Kind) facts (and, for
;; federation, peer_rel/trust facts) under the engine ruleset
;; (lib/relations/engine.sx). The query functions live in engine.sx; this module
;; owns db construction, the assert/retract lifecycle, and a current-db
;; convenience layer for callers that load a fact base once and query without
;; threading the db around. This mirrors lib/acl/api.sx.
(define
relations-build-db
(fn (facts) (dl-program-data facts relations-rules)))
(define relations-current-db nil)
(define
relations/load!
(fn
(facts)
(do
(set! relations-current-db (relations-build-db facts))
relations-current-db)))
(define
relations-ensure-db!
(fn
()
(do
(when
(= relations-current-db nil)
(set! relations-current-db (relations-build-db (list))))
relations-current-db)))
;; Add a relationship to the current db (re-saturates).
(define
relations/relate
(fn
(src dst kind)
(dl-assert! (relations-ensure-db!) (relations-rel src dst kind))))
;; Remove a relationship from the current db (re-saturates).
(define
relations/unrelate
(fn
(src dst kind)
(dl-retract! (relations-ensure-db!) (relations-rel src dst kind))))
(define
relations/children
(fn (node kind) (relations-children-of (relations-ensure-db!) node kind)))
(define
relations/parents
(fn (node kind) (relations-parents-of (relations-ensure-db!) node kind)))
(define
relations/related
(fn (node kind) (relations-related (relations-ensure-db!) node kind)))
(define
relations/descendants
(fn (node kind) (relations-descendants (relations-ensure-db!) node kind)))
(define
relations/ancestors
(fn (node kind) (relations-ancestors (relations-ensure-db!) node kind)))
(define
relations/reachable?
(fn (a b kind) (relations-reachable? (relations-ensure-db!) a b kind)))
(define
relations/roots
(fn (kind) (relations-roots (relations-ensure-db!) kind)))
(define
relations/leaves
(fn (kind) (relations-leaves (relations-ensure-db!) kind)))
(define
relations/cycle?
(fn (node kind) (relations-cycle? (relations-ensure-db!) node kind)))
(define
relations/acyclic?
(fn (kind) (relations-acyclic? (relations-ensure-db!) kind)))
(define
relations/siblings
(fn (node kind) (relations-siblings (relations-ensure-db!) node kind)))
(define
relations/out-degree
(fn (node kind) (relations-out-degree (relations-ensure-db!) node kind)))
(define
relations/in-degree
(fn (node kind) (relations-in-degree (relations-ensure-db!) node kind)))
(define
relations/connected?
(fn (a b kind) (relations-connected? (relations-ensure-db!) a b kind)))