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