(defn parse [f] (fn [input-sequence] (when (and (seq input-sequence) (f (first input-sequence))) input-sequence))) (defn parse-thing-with-level [level] (parse (fn [input] (= level (:level input))))) (defn ordered-choice [a b] (fn [input-sequence] (if-let [parsed (seq (a input-sequence))] parsed (b input-sequence)))) (defn sequence [a b] (fn [input-sequence] (when-let [parsed (seq (a input-sequence))] (when-let [parsed2 (seq (b (rest input-sequence)))] (cons [(first parsed) (first parsed2)] (rest parsed2)))))) (defn optional [a] (fn [input-sequence] (if (seq input-sequence) (if-let [parsed (seq (a input-sequence))] parsed (cons nil input-sequence)) (cons nil input-sequence)))) (defn nothing [input-sequence] (cons nil input-sequence)) (defn reduction [p f] (fn [input-sequence] (if-let [parsed (seq (p input-sequence))] (cons (f (first parsed)) (rest parsed)) nil))) (declare A) (defn a-list [level] (fn [input-sequence] ((ordered-choice (reduction (sequence (A level) (a-list level)) (fn [[a b]] (cons a b))) nothing) input-sequence))) (defn A [level] (reduction (sequence (parse-thing-with-level level) (a-list (inc level))) (fn [[a b]] (assoc a :items b)))) ((requiring-resolve 'clojure.pprint/pprint) (first ((A 1) [{:level 1, :label "PRODUCTS OF AGRICULTURE, FORESTRY AND FISHING"} {:level 2, :code "01.11", :label "Cereals (except rice), leguminous crops and oil seeds"} {:level 3, :code "01.11.11", :label "Durum wheat"} {:level 3, :code "01.11.12", :label "Wheat, except durum wheat"} {:level 3, :code "01.11.20", :label "Maize"}])))
Generated At 2023-05-15T16:26:36-0700 original