summaryrefslogtreecommitdiff
path: root/src/unheard/time_object.clj
blob: d2e888ff1e2c3fb7d355a8ff94b3e9928f3ccf38 (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
(ns unheard.time-object
  (:require [missionary.core :as m]
            [helins.interval.map :as imap]))

;; TODO: Update description
(defn time-object
  "A time-object takes a start time, and end time, and a value.
  Value is a flow that will be consumed when the corresponding
  time tree is consumed at a point in time within the time-object's
  interval.
  "
  [start duration value]
  {:start start, :duration duration, :value value})

(defn lift
  "Lift collection of time objects to a phrase"
  [& children]
  {:start 0, :time-objects children})

;; BUG c9be408
(defn phrase
  [& children]
  (fn [start]
    {:start start,
     :time-objects (for [child children
                         time-object (:time-objects child)]
                     (update time-object :start (partial + start)))}))

(comment
  (def a (phrase (lift (time-object 0 4 :x))))
  (def b
    (phrase (a 0)
            (a 1)
            (lift (time-object 10 2 :x))
            (lift (time-object 0 2 :y))))
  (def c (phrase (b 0) (b 3)))
  (c 0))

(defn timeline
  "Primary timeline bookkeeping mehanism."
  [{:keys [time-objects]}]
  (let [m imap/empty]
    (if (seq? time-objects)
      (loop [time-objects time-objects
             m m]
        (let [{:keys [start duration value]} (first time-objects)
              m (imap/mark m start (+ start duration) value)
              rem (rest time-objects)]
          (if (seq rem) (recur rem m) m)))
      m)))

(comment
  (def t (timeline (a 0)))
  (def t (timeline (c 0)))
  (get t 2))

(defn point-query
  "Query a timeline. Returns a flow of time objects."
  [timeline >at]
  (m/ap (let [at (m/?< >at)] (get timeline at))))

(comment
  (def at (atom 0))
  (def >at (m/watch at))
  (def cancel ((m/reduce prn nil (point-query t >at)) prn prn))
  (reset! at 0)
  (cancel))