(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