-
Notifications
You must be signed in to change notification settings - Fork 0
/
lyrics_event.cljc
69 lines (59 loc) · 2.12 KB
/
lyrics_event.cljc
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
(ns clj-karaoke.lyrics-event
(:require [clj-karaoke.protocols :refer [->map with-offset PMap
PLyrics get-text get-offset
played? get-next-event
map->]]
[clj-karaoke.utils :refer [generate-id ensure-id]]))
;; [clj-karaoke.lyrics-event-specs :as specs]))
;; [clojure.spec.alpha :as s]))
;; (s/check-asserts false)
(defn event->map
"generate a map representation of the event"
[this]
;; {:pre [(s/and
;; (s/valid? ::specs/lyrics-event this))]
;; ;; (s/valid? #(= 'clj_karaoke.lyrics_event.MidiLyricsEvent (type %)) this))]
;; :post [(s/valid? ::specs/lyrics-event-map %)]}
{:id (:id this)
:type :lyrics-event
:offset (:offset this)
:ticks (:ticks this)
:text (:text this)
:midi-type (:midi-type this)})
(defrecord ^:export MidiLyricsEvent [text ticks midi-type]
PMap
(->map [this]
(event->map this))
PLyrics
(get-text [this] text)
(get-offset [this] (:offset this))
(played? [this time] (> time (:offset this)))
(get-next-event [this time]
(if (< time (:offset this))
this
nil)))
(defn create-lyrics-event
[& {:keys [id text ticks type offset midi-type]
:or {text ""
midi-type 5
type :lyrics-event
ticks 0
id (generate-id)
offset 0}}]
;; {:pre [(s/valid? ::specs/lyrics-event-map
;; {:id id
;; :text text
;; :ticks ticks
;; :offset offset
;; :type type
;; :midi-type midi-type})]
;; :post [(s/valid? ::specs/lyrics-event %)]}
(-> (->MidiLyricsEvent text ticks midi-type)
(assoc :id id :offset offset)))
(defmethod map-> :lyrics-event
[{:keys [ticks text midi-type offset id]
:or {id (generate-id)}}]
(-> (->MidiLyricsEvent text ticks midi-type)
(assoc :offset offset
:id id)
(ensure-id)))