interleaved_temp_storage/
interleaved_temp_storage.rs1use std::{
2 io::{Read, Write},
3 thread,
4};
5
6use midi_toolkit::io::InterleavedTempFile;
7
8fn main() {
9 let storage = InterleavedTempFile::new_temp().unwrap();
10 let mut handles = Vec::new();
11
12 for stream_index in 0..4 {
13 let mut writer = storage.spawn_stream();
14 handles.push(thread::spawn(move || {
15 let stream_id = writer.stream_id();
16 let chunks = [
17 format!("track-{stream_index}:header|"),
18 format!("track-{stream_index}:events|"),
19 format!("track-{stream_index}:tail"),
20 ];
21
22 let mut expected = String::new();
23 for chunk in chunks {
24 writer.write_all(chunk.as_bytes()).unwrap();
25 expected.push_str(&chunk);
26 }
27
28 writer.flush().unwrap();
29 (stream_id, expected)
30 }));
31 }
32
33 let mut expected_streams = Vec::new();
34 for handle in handles {
35 expected_streams.push(handle.join().unwrap());
36 }
37 expected_streams.sort_unstable_by_key(|(stream_id, _)| *stream_id);
38
39 println!("Backing file: {}", storage.path().display());
40 for (stream_id, expected) in expected_streams {
41 let mut reader = storage.open_reader(stream_id).unwrap();
42 let mut actual = String::new();
43 reader.read_to_string(&mut actual).unwrap();
44
45 assert_eq!(actual, expected);
46 println!("stream {stream_id}: {actual}");
47 }
48}