1use std::fmt::Debug;
2
3use crate::{
4 events::{BatchTempo, CastEventDelta, MIDIDelta, MIDIEvent, MIDIEventEnum},
5 notes::{MIDINote, Note},
6 num::MIDINum,
7};
8
9use super::{
10 common::{to_vec_result, unwrap_items, wrap_ok, TimeCaster},
11 conversion::{events_to_notes, notes_to_events},
12 event::{
13 cancel_tempo_events, convert_events_into_batches, filter_events, filter_non_note_events,
14 filter_note_events, get_channel_statistics, get_channels_array_statistics,
15 into_track_events, merge_events_array, scale_event_ppq, scale_event_time,
16 ChannelGroupStatistics, ChannelStatistics, Delta, EventBatch, Track,
17 },
18 note::merge_notes_iterator,
19};
20
21pub trait IntoOkExt: Iterator + Sized {
22 fn into_ok(self) -> impl Iterator<Item = Result<Self::Item, ()>> {
23 wrap_ok(self)
24 }
25}
26
27impl<I: Iterator> IntoOkExt for I {}
28
29pub trait ResultIterExt<T, Err>: Iterator<Item = Result<T, Err>> + Sized {
30 fn unwrap_items(self) -> impl Iterator<Item = T>
31 where
32 T: Debug,
33 Err: Debug,
34 {
35 unwrap_items(self)
36 }
37
38 fn collect_vec_result(self) -> Result<Vec<T>, Err> {
39 to_vec_result(self)
40 }
41}
42
43impl<T, Err, I> ResultIterExt<T, Err> for I where I: Iterator<Item = Result<T, Err>> + Sized {}
44
45pub trait EventSequenceExt<D: MIDINum, E, Err>:
46 Iterator<Item = Result<Delta<D, E>, Err>> + Sized
47{
48 fn cast_event_delta<ND: MIDINum>(
49 self,
50 ) -> impl Iterator<Item = Result<<Delta<D, E> as CastEventDelta<ND>>::Output, Err>>
51 where
52 Delta<D, E>: CastEventDelta<ND>,
53 {
54 TimeCaster::<ND>::cast_event_delta(self)
55 }
56
57 fn scale_event_time(self, multiplier: D) -> impl Iterator<Item = Result<Delta<D, E>, Err>>
58 where
59 Delta<D, E>: MIDIDelta<D>,
60 {
61 scale_event_time(self, multiplier)
62 }
63
64 fn scale_event_ppq(self, from: D, to: D) -> impl Iterator<Item = Result<Delta<D, E>, Err>>
65 where
66 Delta<D, E>: MIDIEvent + MIDIDelta<D>,
67 {
68 scale_event_ppq(self, from, to)
69 }
70
71 fn filter_events(
72 self,
73 predicate: impl Fn(&Delta<D, E>) -> bool,
74 ) -> impl Iterator<Item = Result<Delta<D, E>, Err>>
75 where
76 Delta<D, E>: MIDIEventEnum + MIDIDelta<D>,
77 {
78 filter_events(self, predicate)
79 }
80
81 fn filter_note_events(self) -> impl Iterator<Item = Result<Delta<D, E>, Err>>
82 where
83 Delta<D, E>: MIDIEventEnum + MIDIDelta<D>,
84 {
85 filter_note_events(self)
86 }
87
88 fn filter_non_note_events(self) -> impl Iterator<Item = Result<Delta<D, E>, Err>>
89 where
90 Delta<D, E>: MIDIEventEnum + MIDIDelta<D>,
91 {
92 filter_non_note_events(self)
93 }
94
95 fn cancel_tempo_events(self, new_tempo: u32) -> impl Iterator<Item = Result<Delta<D, E>, Err>>
96 where
97 Delta<D, E>: BatchTempo + MIDIDelta<D>,
98 {
99 cancel_tempo_events(self, new_tempo)
100 }
101
102 fn event_batches(self) -> impl Iterator<Item = Result<Delta<D, EventBatch<E>>, Err>>
103 where
104 Delta<D, E>: MIDIDelta<D>,
105 {
106 convert_events_into_batches(self)
107 }
108
109 fn into_track_events(
110 self,
111 track: u32,
112 ) -> impl Iterator<Item = Result<Delta<D, Track<E>>, Err>> {
113 into_track_events(self, track)
114 }
115
116 fn events_to_notes(self) -> impl Iterator<Item = Result<Note<D>, Err>>
117 where
118 E: MIDIEventEnum,
119 {
120 events_to_notes(self)
121 }
122
123 fn channel_statistics(self) -> Result<ChannelStatistics<D>, Err>
124 where
125 Delta<D, E>: MIDIEventEnum + MIDIDelta<D>,
126 {
127 get_channel_statistics(self)
128 }
129}
130
131impl<D: MIDINum, E, Err, I> EventSequenceExt<D, E, Err> for I where
132 I: Iterator<Item = Result<Delta<D, E>, Err>> + Sized
133{
134}
135
136pub trait EventSequenceCollectionExt<D: MIDINum, T, Err, I>: Iterator<Item = I> + Sized
137where
138 T: MIDIDelta<D>,
139 I: Iterator<Item = Result<T, Err>> + Sized,
140{
141 fn merge_all(self) -> impl Iterator<Item = Result<T, Err>> {
142 merge_events_array(self.collect())
143 }
144
145 fn channel_statistics(self) -> Result<ChannelGroupStatistics<D>, Err>
146 where
147 T: MIDIEventEnum + MIDIDelta<D>,
148 Err: Send,
149 I: Send,
150 {
151 get_channels_array_statistics(self.collect())
152 }
153}
154
155impl<D: MIDINum, T, Err, I, II> EventSequenceCollectionExt<D, T, Err, I> for II
156where
157 T: MIDIDelta<D>,
158 I: Iterator<Item = Result<T, Err>> + Sized,
159 II: Iterator<Item = I> + Sized,
160{
161}
162
163pub trait NoteSequenceExt<D: MIDINum, N, Err>: Iterator<Item = Result<N, Err>> + Sized
164where
165 N: MIDINote<D>,
166{
167 fn notes_to_events(self) -> impl Iterator<Item = Result<Delta<D, crate::events::Event>, Err>> {
168 notes_to_events(self)
169 }
170}
171
172impl<D: MIDINum, N, Err, I> NoteSequenceExt<D, N, Err> for I
173where
174 N: MIDINote<D>,
175 I: Iterator<Item = Result<N, Err>> + Sized,
176{
177}
178
179pub trait NoteSequenceCollectionExt<D: MIDINum, N, Err, I>: Iterator<Item = I> + Sized
180where
181 N: MIDINote<D>,
182 I: Iterator<Item = Result<N, Err>> + Sized,
183{
184 fn merge_all(self) -> impl Iterator<Item = Result<N, Err>> {
185 merge_notes_iterator(self)
186 }
187}
188
189impl<D: MIDINum, N, Err, I, II> NoteSequenceCollectionExt<D, N, Err, I> for II
190where
191 N: MIDINote<D>,
192 I: Iterator<Item = Result<N, Err>> + Sized,
193 II: Iterator<Item = I> + Sized,
194{
195}