summaryrefslogtreecommitdiff
path: root/portal.clj
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)))))