Skip to content

Instantly share code, notes, and snippets.

@gabehollombe
Last active February 2, 2016 10:22
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 gabehollombe/1850cd9bc985d7dcb313 to your computer and use it in GitHub Desktop.
Save gabehollombe/1850cd9bc985d7dcb313 to your computer and use it in GitHub Desktop.
(ns private.tmp.foo
(:require [manifold.stream :as s]
[clojure.core.async :as a]))
(def sock (atom nil))
(def destination-chan (a/chan))
(defn get-sock [] (s/stream))
(defn stay-connected [sock-atom sock-fn dest-chan]
(letfn [(disconnect-handler []
(reset! sock-atom (sock-fn))
(s/connect @sock-atom dest-chan {:downstream? false})
(s/on-closed @sock-atom disconnect-handler))]
(reset! sock (sock-fn))
(s/connect @sock-atom dest-chan {:downstream? false})
(s/on-closed @sock-atom disconnect-handler)))
;; connect up my sock atom with the destination chan in a resilient fashion
(stay-connected sock get-sock destination-chan)
;; Put a message onto destination-chan via @sock
(s/put! @sock "Hello")
;; Take it out of destination-chan
(a/go (println (a/<! destination-chan)))
;; Close the sock, which should get re-opened and re-connected to destination-chan automatially
(s/close! @sock)
;; Put a new message onto destination-chan via the reconnected @sock
(s/put! @sock "World")
;; Show that it ends up on destination chan as well
(a/go (println (a/<! destination-chan)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment