Skip to content

Instantly share code, notes, and snippets.

@cgrand
Forked from ztellman/foami.clj
Created September 22, 2017 16:02
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 cgrand/f7a8c816acd8a17c0ae83dd67eb31e53 to your computer and use it in GitHub Desktop.
Save cgrand/f7a8c816acd8a17c0ae83dd67eb31e53 to your computer and use it in GitHub Desktop.
(ns foami.core
"FOreign Asynchronous Mechanism Interop"
(:require [clojure.core.async :as async]))
(defn put!
"Takes a `ch`, a `msg`, a single arg function that when passed `true` enables backpressure
and when passed `false` disables it, and a no-arg function which, when invoked, closes the
upstream source."
[ch msg backpressure! close!]
(let [status (atom :sending]
(async/put! ch msg
(fn [result]
(if-not result
(close!)
(cond
(compare-and-set! status :sending :sent)
nil
(compare-and-set! status :paused :sent)
(backpressure! false)))))
(when (compare-and-set! status :sending :paused)
(backpressure! true))
nil))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment