diff --git a/lib/hyperscript/runtime.sx b/lib/hyperscript/runtime.sx index d5f02c38..03acd99e 100644 --- a/lib/hyperscript/runtime.sx +++ b/lib/hyperscript/runtime.sx @@ -687,14 +687,70 @@ (dom-insert-adjacent-html target "beforeend" (str value))) (true nil))))) ;; Property-based is — check obj.key truthiness +(define + hs-host-to-sx + (fn + (v) + (cond + ((nil? v) v) + ((number? v) v) + ((string? v) v) + ((boolean? v) v) + (true + (let + ((marker (host-get v "_type"))) + (cond + ((= marker "dict") + (let + ((out (dict))) + (begin + (for-each + (fn (k) (dict-set! out k (hs-host-to-sx (get v k)))) + (keys v)) + out))) + ((= marker "list") (map hs-host-to-sx v)) + (true + (let + ((is-array (host-call (host-global "Array") "isArray" v))) + (if + is-array + (let + ((len (host-get v "length")) (out (list))) + (begin + (let + ((i 0)) + (for-each + (fn + (_) + (begin + (set! + out + (append + out + (list (hs-host-to-sx (host-get v i))))) + (set! i (+ i 1)))) + (range 0 len))) + out)) + (let + ((out (dict))) + (begin + (for-each + (fn + (k) + (dict-set! out k (hs-host-to-sx (host-get v k)))) + (host-call (host-global "Object") "keys" v)) + out))))))))))) +;; Array slicing (inclusive both ends) (define hs-fetch (fn (url format) (let - ((fmt (cond ((nil? format) "text") ((or (= format "JSON") (= format "json") (= format "Object") (= format "object")) "json") ((or (= format "HTML") (= format "html")) "html") ((or (= format "Response") (= format "response")) "response") ((or (= format "Text") (= format "text")) "text") (true format)))) - (perform (list "io-fetch" url fmt))))) -;; Array slicing (inclusive both ends) + ((fmt (cond ((nil? format) "text") ((or (= format "json") (= format "JSON") (= format "Object")) "json") ((or (= format "html") (= format "HTML")) "html") ((or (= format "response") (= format "Response")) "response") ((or (= format "text") (= format "Text")) "text") (true format)))) + (let + ((raw (perform (list "io-fetch" url fmt)))) + (cond ((= fmt "json") (hs-host-to-sx raw)) (true raw)))))) +;; Collection: sorted by (define hs-json-escape (fn @@ -725,7 +781,7 @@ (walk) out) "\""))) -;; Collection: sorted by +;; Collection: sorted by descending (define hs-json-stringify (fn @@ -749,7 +805,7 @@ (keys v))) "}")) (true (hs-json-escape (str v)))))) -;; Collection: sorted by descending +;; Collection: split by (define hs-coerce (fn @@ -856,7 +912,7 @@ (map (fn (k) (list k (get value k))) (keys value)) value)) (true value)))) -;; Collection: split by +;; Collection: joined by (define hs-gather-form-nodes (fn @@ -890,7 +946,7 @@ (each 0))))))))) (walk root) acc))) -;; Collection: joined by + (define hs-values-from-nodes (fn (nodes) (reduce hs-values-absorb (dict) nodes))) diff --git a/shared/static/wasm/sx/hs-runtime.sx b/shared/static/wasm/sx/hs-runtime.sx index d5f02c38..03acd99e 100644 --- a/shared/static/wasm/sx/hs-runtime.sx +++ b/shared/static/wasm/sx/hs-runtime.sx @@ -687,14 +687,70 @@ (dom-insert-adjacent-html target "beforeend" (str value))) (true nil))))) ;; Property-based is — check obj.key truthiness +(define + hs-host-to-sx + (fn + (v) + (cond + ((nil? v) v) + ((number? v) v) + ((string? v) v) + ((boolean? v) v) + (true + (let + ((marker (host-get v "_type"))) + (cond + ((= marker "dict") + (let + ((out (dict))) + (begin + (for-each + (fn (k) (dict-set! out k (hs-host-to-sx (get v k)))) + (keys v)) + out))) + ((= marker "list") (map hs-host-to-sx v)) + (true + (let + ((is-array (host-call (host-global "Array") "isArray" v))) + (if + is-array + (let + ((len (host-get v "length")) (out (list))) + (begin + (let + ((i 0)) + (for-each + (fn + (_) + (begin + (set! + out + (append + out + (list (hs-host-to-sx (host-get v i))))) + (set! i (+ i 1)))) + (range 0 len))) + out)) + (let + ((out (dict))) + (begin + (for-each + (fn + (k) + (dict-set! out k (hs-host-to-sx (host-get v k)))) + (host-call (host-global "Object") "keys" v)) + out))))))))))) +;; Array slicing (inclusive both ends) (define hs-fetch (fn (url format) (let - ((fmt (cond ((nil? format) "text") ((or (= format "JSON") (= format "json") (= format "Object") (= format "object")) "json") ((or (= format "HTML") (= format "html")) "html") ((or (= format "Response") (= format "response")) "response") ((or (= format "Text") (= format "text")) "text") (true format)))) - (perform (list "io-fetch" url fmt))))) -;; Array slicing (inclusive both ends) + ((fmt (cond ((nil? format) "text") ((or (= format "json") (= format "JSON") (= format "Object")) "json") ((or (= format "html") (= format "HTML")) "html") ((or (= format "response") (= format "Response")) "response") ((or (= format "text") (= format "Text")) "text") (true format)))) + (let + ((raw (perform (list "io-fetch" url fmt)))) + (cond ((= fmt "json") (hs-host-to-sx raw)) (true raw)))))) +;; Collection: sorted by (define hs-json-escape (fn @@ -725,7 +781,7 @@ (walk) out) "\""))) -;; Collection: sorted by +;; Collection: sorted by descending (define hs-json-stringify (fn @@ -749,7 +805,7 @@ (keys v))) "}")) (true (hs-json-escape (str v)))))) -;; Collection: sorted by descending +;; Collection: split by (define hs-coerce (fn @@ -856,7 +912,7 @@ (map (fn (k) (list k (get value k))) (keys value)) value)) (true value)))) -;; Collection: split by +;; Collection: joined by (define hs-gather-form-nodes (fn @@ -890,7 +946,7 @@ (each 0))))))))) (walk root) acc))) -;; Collection: joined by + (define hs-values-from-nodes (fn (nodes) (reduce hs-values-absorb (dict) nodes)))