use filter> user=> (def c (chan 10)) #'user/c user=> (def cf (filter> #(if (even? %) % (throw (IllegalArgumentException.))) c)) #'user/cf user=> (>!! cf 2) nil user=> (>!! cf 1) IllegalArgumentException user/fn--4294 (form-init9067455327434905636.clj:1) user=> (>!! cf 4) nil user=> (<!! cf) 2 user=> (<!! cf) 4
JW On Wed, Jan 22, 2014 at 9:43 AM, t x <[email protected]> wrote: > With apologies for spamming: > > in case anyone else wanted a solution to this problem: > > I believe the right layer is to wrap at the Channel layer, rather than the > Buffer layer: for example: > > > (ns test > (:require > #+clj [clojure.core.async.impl.protocols :as impl] > #+cljs [cljs.core.async.impl.protocols :as impl] > #+clj [clojure.core.async.impl.channels :as channels] > #+cljs [cljs.core.async.impl.channels :as channels] > #+clj [clojure.core.async :as async] > #+cljs [cljs.core.async :as async])) > > (do > > (deftype CheckedChannel [chan check] > impl/WritePort (put! [this val handler] > (check val) > (impl/put! chan val handler)) > impl/ReadPort (take! [this handler] > (impl/take! chan handler)) > impl/Channel (close! [this] > (impl/close! chan))) > > > (defn cchan [n check] > (CheckedChannel. (async/chan n) check)) > > > (def oc (cchan 100 #(assert (even? %)))) > > (println "Line 1") > (async/alts!! [[oc 2]] :default :chan-full) > (println "Line 2") > (async/alts!! [[oc 3]] :default :chan-full) > (println "Line 3") > (async/alts!! [[oc 3]] :default :chan-full) > (println "Line 4") > > ) > > > > On Wed, Jan 22, 2014 at 12:02 AM, t x <[email protected]> wrote: > >> Consider the following attempt: >> >> for some reason, after the assertion fails, the main repl thread seems to >> lock up >> >> Line 1 >> Line 2 // after this, no more is printed >> >> >> Question: what is causing the problem -- and how do I fix it? >> >> Thanks! >> >> === code === >> >> (ns test >> (:require >> #+clj [clojure.core.async.impl.protocols :as impl] >> #+cljs [cljs.core.async.impl.protocols :as impl] >> #+clj [clojure.core.async.impl.channels :as channels] >> #+cljs [cljs.core.async.impl.channels :as channels] >> #+clj [clojure.core.async :as async] >> #+cljs [cljs.core.async :as async])) >> >> (do >> >> (deftype CheckedBuffer [buf check] >> impl/Buffer >> (full? [this] (impl/full? buf)) >> (remove! [this] (impl/remove! buf)) >> (add! [this itm] >> (check itm) >> (impl/add! buf itm))) >> >> >> (defn cchan [n check] >> (channels/chan (CheckedBuffer. (async/buffer n) check))) >> >> >> (def oc (cchan 100 #(assert (even? %)))) >> >> (println "Line 1") >> (async/alts!! [[oc 2]] :default :chan-full) >> (println "Line 2") >> (async/alts!! [[oc 3]] :default :chan-full) >> (println "Line 3") >> (async/alts!! [[oc 3]] :default :chan-full) >> (println "Line 4") >> >> ) >> >> >> >> On Tue, Jan 21, 2014 at 11:46 PM, Kelker Ryan <[email protected]>wrote: >> >>> Can't you just test the value before placing a value in a channel? >>> >>> 22.01.2014, 16:27, "t x" <[email protected]>: >>> >>> Hi, >>> >>> >>> ## Question: >>> >>> For a channel, is it possible to put a pre-condition of sorts on a >>> channel? >>> >>> For example: >>> >>> (let [chan (async/chan 100)] >>> (set-pre-condition! chan even?) >>> (put! chan 1) ;; exception thrown >>> (>!! chan 3) ;; exception thrown >>> ) >>> >>> ## Asides >>> >>> It's important that I want the exception to be thrown at the time of >>> put, NOT at the time of take via <! or <!!. >>> Thanks! >>> >>> >>> -- >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "Clojure" group. >>> To post to this group, send email to [email protected] >>> Note that posts from new members are moderated - please be patient with >>> your first post. >>> To unsubscribe from this group, send email to >>> [email protected] >>> For more options, visit this group at >>> http://groups.google.com/group/clojure?hl=en >>> --- >>> You received this message because you are subscribed to the Google >>> Groups "Clojure" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to [email protected]. >>> For more options, visit https://groups.google.com/groups/opt_out. >>> >>> -- >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "Clojure" group. >>> To post to this group, send email to [email protected] >>> Note that posts from new members are moderated - please be patient with >>> your first post. >>> To unsubscribe from this group, send email to >>> [email protected] >>> For more options, visit this group at >>> http://groups.google.com/group/clojure?hl=en >>> --- >>> You received this message because you are subscribed to the Google >>> Groups "Clojure" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to [email protected]. >>> For more options, visit https://groups.google.com/groups/opt_out. >>> >> >> > -- > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to [email protected] > Note that posts from new members are moderated - please be patient with > your first post. > To unsubscribe from this group, send email to > [email protected] > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > --- > You received this message because you are subscribed to the Google Groups > "Clojure" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/groups/opt_out. > -- -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to [email protected] Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/groups/opt_out.
