blob: 2e20bdf9957d90425bed13e3ef2ed7e1b333336b (
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
(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)))))
|