From c12cb20e2be63ad6929765a2767a5ec333560dc3 Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Tue, 18 Aug 2015 19:15:17 -0700 Subject: [PATCH] allow `decode` procedures to return lists of values (which get spliced) --- decode.rkt | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/decode.rkt b/decode.rkt index 745e92c..78fb170 100644 --- a/decode.rkt +++ b/decode.rkt @@ -20,6 +20,13 @@ [(or (list? x) (hash? x) (vector? x)) (format "~v" x)] ; ok to convert datatypes [else (error)])))) ; but things like procedures should throw an error +(define (->list/tx x) + ;; same as ->list but catches special case of single txexpr, + ;; which is itself a list, but in this case should be wrapped into a list, + ;; for use with append-map. + (if (txexpr? x) + (list x) + (->list x))) ;; decoder wireframe (define+provide/contract (decode txexpr @@ -58,8 +65,11 @@ ;; e.g., ((p "foo")) tests out as both txexpr-attrs and txexpr-elements (let ([decoded-txexpr (apply make-txexpr (list (txexpr-tag-proc tag) - (txexpr-attrs-proc attrs) - (map loop (txexpr-elements-proc elements))))]) + (txexpr-attrs-proc attrs) + ;; append-map allows "splicing" behavior, + ;; meaning decoder procedures can return a single value + ;; or multiple values. + (append-map (compose1 ->list/tx loop) (txexpr-elements-proc elements))))]) ((if (block-txexpr? decoded-txexpr) block-txexpr-proc inline-txexpr-proc) decoded-txexpr))))]