У меня есть два однонаправленных канала: core.async
Clojure - core.async объединить однонаправленный канал
- канала из может только
put!
- канал может только
take!
И поскольку это ClojureScript блокировка операции недоступны. Я хотел бы сделать один двунаправленный (входной) канал из этих двух (в и из).
(def in (async/chan))
(def out (async/chan))
(def in-out (io-chan in out)) ;; io or whatever the solution is
(async/put! in "test")
(async/take! ch (fn [x] (println x))) ;; should print "test"
(async/put! ch) ;; put into ch is equivalent to putting into `out`
Я пытался что-то вроде следующего (не работает):
(defn io-chan [in-ch out-ch]
(let [io (chan)]
(go-loop []
(>! out-ch (<! io))
(>! io (<! in-ch))
(recur))
io))
Схема может помочь:
out in-out
---------------> (unused)
<--------------- <---------------
in
----------------> ---------------->
<---------------- (unused)
Кроме того, закрытие двунаправленного канала следует закрыть оба канала, лежащие в основе.
Is is?
Извините, я не использую ваш случай использования, возможно, вы могли бы добавить пример кода того, что хотите? –
@ ValentinWaeselynck Я отредактировал мой вопрос, надеюсь, теперь это имеет смысл. – nha
Все еще не уверен, что получаю:/вы указываете 6 названий каналов в своем описании (A, B, in, out, io, ch). помогло бы, если бы вы объединили это –