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.