blob: 4d4e59e2332c22057bdd0fb3f962835d70e15ef3 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
(ns portal
(:require [missionary.core :as m]
[clojure.set :refer [union difference]]))
(def focused-tags (atom #{}))
(def >focused-tags (m/signal (m/watch focused-tags)))
(def seen-tags (atom #{}))
(def >seen-tags (m/signal (m/watch seen-tags)))
(defn rec
"Record flow f, tagging with id."
[id f]
(m/ap (let [capturing? (atom nil)
[tag value] (m/amb= [:focused-tags (m/?< >focused-tags)]
[:event (m/?< f)])]
(case tag
:focused-tags (do (reset! capturing? (boolean (value id))) (m/amb))
:event (do (swap! seen-tags conj id)
(when @capturing?
(m/? (m/via m/blk
((requiring-resolve 'portal.api/submit)
[id value]))))
value)))))
(defn ptags "Print all available tags." [] @seen-tags)
(def show-portal? (atom false))
(def >show-portal? (rec :show-portal? (m/signal (m/watch show-portal?))))
(defn show-portal "Show portal window." [] (reset! show-portal? true))
(defn hide-portal "Hide portal window." [] (reset! show-portal? false))
(def >portal-ui
(m/ap (let [ui (m/? (m/via m/blk ((requiring-resolve 'portal.api/open))))]
(m/amb= ui
(try (m/? m/never)
(finally
;; Were this blocking, I would put this on m/blk
((requiring-resolve 'portal.api/close) ui)
(m/amb)))))))
(def >portal-ui-toggle
(m/ap (when (m/?< >show-portal?) (m/?< >portal-ui) (m/amb))))
(defn cap
"Capture flow elements with specified ids to portal"
[& ids]
(reset! focused-tags (into #{} ids)))
(defn +cap
"Add do portal capture set"
[& ids]
(swap! focused-tags union (into #{} ids)))
(defn -cap
"Remove from portal capture set"
[& ids]
(swap! focused-tags difference (into #{} ids)))
(def >portal-main
"Main entrypoint."
(m/ap (m/amb= (do (m/?< >portal-ui-toggle) (m/amb)))))
|