;; ==========================================================================
;; content.sx — Content-addressed computation
;;
;; Hash frozen SX to a content identifier. Store and retrieve by CID.
;; The content IS the address — same SX always produces the same CID.
;;
;; This is a library built on top of freeze.sx. It is NOT part of the
;; core evaluator. Load order: evaluator.sx → freeze.sx → content.sx
;;
;; Uses an in-memory content store. Applications can persist to
;; localStorage or IPFS by providing their own store backend.
;; ==========================================================================


(define-library (sx content)
  (export
    content-store
    content-hash
    content-put
    content-get
    freeze-to-cid
    thaw-from-cid)
  (begin

(define content-store (dict))

(define content-hash :effects []
  (fn (sx-text)
    ;; djb2 hash → hex string. Simple, deterministic, fast.
    ;; Real deployment would use SHA-256 / multihash.
    (let ((hash 5381))
      (for-each (fn (i)
        (set! hash (mod (+ (* hash 33) (char-code-at sx-text i)) 4294967296)))
        (range 0 (len sx-text)))
      (to-hex hash))))

(define content-put :effects [mutation]
  (fn (sx-text)
    (let ((cid (content-hash sx-text)))
      (dict-set! content-store cid sx-text)
      cid)))

(define content-get :effects []
  (fn (cid)
    (get content-store cid)))

;; Freeze a scope → store → return CID
(define freeze-to-cid :effects [mutation]
  (fn (scope-name)
    (let ((sx-text (freeze-to-sx scope-name)))
      (content-put sx-text))))

;; Thaw from CID → look up → restore
(define thaw-from-cid :effects [mutation]
  (fn (cid)
    (let ((sx-text (content-get cid)))
      (when sx-text
        (thaw-from-sx sx-text)
        true))))


)) ;; end define-library

;; Re-export to global namespace for backward compatibility
(import (sx content))
