--- /dev/null
+use crate::merge_func::MergeFunc;
+use crate::{Entry, Merger, Reader, Source, Writer};
+use memmap::Mmap;
+
+/*
+Sorter
+ method add(&mut self, e: Entry);
+ method source(self) -> impl Source
+*/
+pub struct Sorter<F: Fn(&mut Entry, &Entry)> {
+ batch: Vec<Entry>,
+ batch_size: usize,
+ max_size: usize,
+ merge_func: F,
+
+ readers: Vec<Reader<Mmap>>,
+}
+
+impl<F> Sorter<F>
+where
+ F: Fn(&mut Entry, &Entry),
+{
+ pub fn new(max_size: usize, merge_func: F) -> Self {
+ Self {
+ batch: Vec::new(),
+ batch_size: 0,
+ max_size,
+ merge_func,
+
+ readers: Vec::new(),
+ }
+ }
+
+ pub fn add(&mut self, e: Entry) {
+ let esize = e.key.len() + e.value.len();
+ if esize + self.batch_size > self.max_size {
+ self.write_chunk();
+ }
+ self.batch.push(e);
+ self.batch_size += esize;
+ }
+
+ pub fn source(mut self) -> MergeFunc<Merger<Reader<Mmap>>, F> {
+ if self.batch.len() > 0 {
+ self.write_chunk();
+ }
+ Merger::from(self.readers).merge_func(self.merge_func)
+ }
+
+ fn write_chunk(&mut self) {}
+}