I am trying to make a conditional converter in Clojure as follows:
(defn if-xf "Takes a predicate and two transducers. Returns a new transducer that routes the input to one of the transducers depending on the result of the predicate." [pred ab] (fn [rf] (let [arf (a rf) brf (b rf)] (fn ([] (rf)) ([result] (rf result)) ([result input] (if (pred input) (arf result input) (brf result input)))))))
This is very useful in that it allows you to do such things:
;; multiply odd numbers by 100, square the evens. (= [0 100 4 300 16 500 36 700 64 900] (sequence (if-xf odd? (map
However, this conditional converter does not work very well with converters that perform cleanup on their 1-arity branch:
;; negs are multiplied by 100, non-negs are partitioned by 2 ;; BUT! where did 6 go? ;; expected: [-600 -500 -400 -300 -200 -100 [0 1] [2 3] [4 5] [6]] ;; (= [-600 -500 -400 -300 -200 -100 [0 1] [2 3] [4 5]] (sequence (if-xf neg? (map #(* % 100)) (partition-all 2)) (range -6 7)))
Is it possible to configure an if-xf definition to handle a cleanup case?
I am trying to do this, but with strange behavior:
(defn if-xf "Takes a predicate and two transducers. Returns a new transducer that routes the input to one of the transducers depending on the result of the predicate." [pred ab] (fn [rf] (let [arf (a rf) brf (b rf)] (fn ([] (rf)) ([result] (arf result) ;; new! (brf result) ;; new! (rf result)) ([result input] (if (pred input) (arf result input) (brf result input)))))))
In particular, washing occurs at the end of:
Is there any way to make this branching / conditional converter without keeping the entire input sequence in a local state inside this converter (i.e., do all the processing in 1-arity branches when clearing)?
source share