새로 로직이 추가되면 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)))))))
어라, 일베간글 이라는걸 읽질 않아서 이렇게 심각한 문젠줄 몰랐네 ㅋㅋ