2015-07-08 6 views
7

Ich möchte einen Kanal von clojure.core.async von einem anderen Kanal erstellen, der nur bestimmte Nachrichten filtert. Daher habe ich eine Funktion namens Filter < gefunden.Wie erstelle ich einen Kanal von einem anderen mit Wandlern?

=> (def c1 (chan)) 
=> (def c2 (filter< even? c1)) 
=> (put! c1 1) 
=> (put! c1 2) 
=> (<!! c2) 
2 

Aber die Funktion und seine Freunde sind als veraltet markiert:

Veraltet - diese Funktion entfernt werden. Verwenden Wandler statt

Es gibt einige Möglichkeiten Kanäle mit Wandler zu verwenden, wie chan mit dem xform Parameter. Wie kann ich einen neuen Kanal aus einem bestehenden mit Schallwandlern bauen?

Antwort

6

ich auf diese etwas Forschung tat, fand ein paar interessante Artikel (first und second), und dann bekam etwas Arbeit mit pipeline

(require '[clojure.core.async :as async :refer [chan <!! pipeline put!]]) 
(def c1 (chan)) 
(def c2 (chan)) 

(pipeline 4 c2 (filter even?) c1) 

(put! c1 1) 
(put! c1 2) 
(<!! c2) 
;;=> 2 

Der zweite Artikel, den ich mit einigen Helfer diese ein wenig sauberer verknüpft macht Funktionen rund um die Pipeline-Funktion:

(defn ncpus [] 
    (.availableProcessors (Runtime/getRuntime))) 

(defn parallelism [] 
    (+ (ncpus) 1)) 

(defn add-transducer 
    [in xf] 
    (let [out (chan (buffer 16))] 
    (pipeline (parallelism) out xf in) 
    out)) 

Dann können Sie einfach Kanäle zusammen binden mit

(def c1 (chan)) 
(def c2 (add-transducer c1 (filter even?)) 

die Antwort vervollständigen, wie Sie selbst gefunden Sie Rohr in ähnlicher Weise verwenden können: mit `pipe`

(defn pipe-trans 
    [ci xf] 
    (let [co (chan 1 xf)] 
    (pipe ci co) 
    co)) 
(def c1 (chan)) 
(def c2 (pipe-trans c1 (filter even?))) 
+0

Inspiriert von Ihnen mir eine facory Methode erstellt. (defn von-chan [ci xf] (let [co (chan 1 vz)] (Rohr ci co) co)) – sschmeck

+0

nett, froh, dass ich helfen konnte. –

+1

Ich habe eine Version Ihrer Factory-Methode hinzugefügt, um zu versuchen, die Antwort zu vervollständigen, falls andere danach suchen. –