我正在编写一些正在进行日志处理的clojurescript。我正在包装一个Javascript库,只要新的日志条目到达就会给我一个回调,即
(.on my-logs-source "log-entry" handle-log-event)
我想使用clojure' partition-by
函数对这些事件执行一些简单的聚合,这些函数会返回一个传感器,并获得结果的向量。将我的事件回调流转换为可以应用换能器的东西的惯用方法是什么?
答案 0 :(得分:1)
您可以使用clojure.async - 它的通道可选择在构造时接受传感器。
以下示例说明了如何实现目标。
(require '[clojure.core.async :as async])
(def ch (async/chan 1 (partition-by odd?)))
(def callback (fn [n] (async/put! ch n)))
(async/go-loop []
(when-some [v (async/<! ch)]
(println "Got" v)
(recur)))
(callback 1)
(callback 1)
(callback 2)
(callback 2)
(callback 3)
(callback 4)
上面的代码将创建一个带换能器的通道。您的回调函数会将收到的所有值发送到该频道。 go块将在通道可用时消耗它们的值。通道消耗的值是传感器产生的结果。
对于上面的示例REPL会话,来自go块的控制台输出将如下:
Got [1 1]
Got [2 2]
Got [3]
现在关闭频道时:
(async/close! ch)
其余数据将从您的传感器中“刷新”:
Got [4]