Comment made by: dnolen
To show how bad the interaction is between core.async and a library like core.match that also generates a lot of code consider the following:
`
(defn foo [e]
(match [e]
[{:type :mouse :client-x x :client-y y}] [x y]
[{:type :mouse :page-x x :page-y y}] [x y]
[{:type :touch :page-x x :page-y y}] [x y]
[{:type :key :char-code c}] c))
`
Without core.async, core.match produces a reasonable amount of code for this typical use of core.match to efficiently match maps - ~230 lines of pretty printed JavaScript.
But if the user wraps this typical expression in a go block:
`
(defn foo [in]
(go (while true
(let [[e c] (<! in)]
(match [e]
[{:type :mouse :client-x x :client-y y}] [x y]
[{:type :mouse :page-x x :page-y y}] [x y]
[{:type :touch :page-x x :page-y y}] [x y]
[{:type :key :char-code c}] c)))))
`
It generates nearly 4200 lines of pretty-printed JavaScript. I fail to see the value of core.async transforming the optimized conditionals generated by core.match, it just generates 18X more code and the extra generated code is obviously useless - a user is matching a value, they cannot put arbitrary computations in the patterns.
https://gist.github.com/swannodette/7723758