1use stak_configuration::DEFAULT_HEAP_SIZE;
4use stak_device::ReadWriteDevice;
5use stak_file::VoidFileSystem;
6use stak_macro::include_r7rs;
7use stak_process_context::VoidProcessContext;
8use stak_r7rs::{SmallError, SmallPrimitiveSet};
9use stak_time::VoidClock;
10use stak_vm::Vm;
11use std::io::{Read, Write, empty};
12
13pub fn minify(reader: impl Read, writer: impl Write) -> Result<(), SmallError> {
15 const BYTECODE: &[u8] = include_r7rs!("minify.scm");
16
17 let mut heap = vec![Default::default(); DEFAULT_HEAP_SIZE];
18 let mut vm = Vm::new(
19 &mut heap,
20 SmallPrimitiveSet::new(
21 ReadWriteDevice::new(reader, writer, empty()),
22 VoidFileSystem::new(),
23 VoidProcessContext::new(),
24 VoidClock::new(),
25 ),
26 )?;
27
28 vm.initialize(BYTECODE.iter().copied())?;
29 vm.run()?;
30
31 Ok(())
32}
33
34#[cfg(test)]
35mod tests {
36 use super::*;
37 use pretty_assertions::assert_eq;
38
39 #[test]
40 fn minify_expression() {
41 let source = "(foo bar)";
42 let mut target = vec![];
43
44 minify(source.as_bytes(), &mut target).unwrap();
45
46 assert_eq!(target, b"(foo bar)\n");
47 }
48
49 #[test]
50 fn minify_expressions() {
51 let source = "(foo bar)\n\n( baz blah )";
52 let mut target = vec![];
53
54 minify(source.as_bytes(), &mut target).unwrap();
55
56 assert_eq!(target, b"(foo bar)\n(baz blah)\n");
57 }
58}