새로 로직이 추가되면 val->channel-key 바꿔주고 랑 key->converter 에 추가 항목 넣어주면 됨.

약 먹었더니 해롱 거리네 ㅋ



(defn user-input [channel]

  (go-loop [[ch & more-ch] (seq "dafvn kjhv89df77234u4mbdfjhGYTDCG;rkgfv")]

    (when ch 

      (>! channel (int ch))

      (recur more-ch))))


(defn val->channel-key [val]

  (cond (<= (int \0) val (int \9)) :int-ch

        (<= (int \a) val (int \z)) :low-alpha-ch

        (<= (int \A) val (int \Z)) :up-alpha-ch

        :else :else-ch))


(defn distributor [in-ch channel-map]

  (go-loop []

    (let [val (<! in-ch)]

      (-> (val->channel-key val)

          channel-map

          (>! val)))

    (recur)))


(defn processor [converter in-channel out-channel]

  (go-loop []

    (->> (<! in-channel)

        converter

        (>! out-channel))

    (recur)))


(defn int->upper [int]

  (-> (char int)

      clojure.string/upper-case))


(defn int->lower [int]

  (-> (char int)

      clojure.string/lower-case))


(defn int->char [int]

  (char int))


(defn int->inc-5 [int]

  (+ int 5))


(def key->converter {:int-ch int->inc-5 :low-alpha-ch int->upper

                     :up-alpha-ch int->lower :else-ch int->char})


(defn make-distribution-channels [keys]

  (zipmap keys

          (repeatedly #(chan 1))))


(defn -main []

  (let [distribution-channel-map (-> (keys key->converter)

                                     make-distribution-channels)

        in-ch (chan 1)

        out-ch (chan 1)]

    (distributor in-ch distribution-channel-map)

    (doseq [[k ch] distribution-channel-map]

      (-> (key->converter k)

          (processor ch out-ch)))

    (user-input in-ch)

    (go-loop [t (timeout 5000)]

      (let [[val chan] (alts! [t out-ch])]

        (if (= chan t)

          (flush)

          (do (print val)

              (recur t)))))))