Skip to content

Instantly share code, notes, and snippets.

@NeilMenne
Last active April 1, 2016 19:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save NeilMenne/05cd24dfb703c63c068e6e8b1d14fe36 to your computer and use it in GitHub Desktop.
Save NeilMenne/05cd24dfb703c63c068e6e8b1d14fe36 to your computer and use it in GitHub Desktop.
mapcat testing
(ns lab.core
(:gen-class)
(:require [clojure.core.async :as a]))
(defn event-proc
"linearize event logging"
[chan]
(a/thread
(loop []
(let [{:keys [label data]} (a/<!! chan)
log (str label " occurred at " (System/currentTimeMillis) ".")
log (if data (str log " Additional data: " data) log)]
(when label
(when (#{:provided :complete} label)
(println log))
(recur))))))
(defn event-fn
[chan]
(fn
([label]
(a/>!! chan {:label label}))
([label data]
(a/>!! chan {:label label
:data data}))))
(defn consumer
[chan event]
(a/thread
(loop []
(when-let [v (a/<!! chan)]
(a/<!! (a/timeout 10))
(event :consumed v)
(recur)))))
(defn provider
[chan lim event]
(a/<!! (a/onto-chan chan (range lim)))
(event :provided))
(defn -main
[]
(let [e (a/chan)
event (event-fn e)
event-proc (event-proc e)
c (a/chan 1 (mapcat range))
consume (consumer c event)]
(provider c 2048 event)
(a/<!! consume)
(event :complete)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment