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
extern crate skimmer;

use self::skimmer::data::Datum;


pub mod volume;
pub mod word;
pub mod extractor;

use model::schema::Schema;
use sage::{ Sage, Idea };

use self::volume::Volume;

use std::sync::mpsc::Receiver;



pub struct Book {
    pub volumes: Vec<Volume>
}


impl Book {
    pub fn new () -> Book {
        Book::with_capacity (1)
    }

    pub fn get_written<S, D> (&mut self, author: &Sage<S, D>)
      where
        S: Schema + 'static,
        D: Datum + Sync + Send + 'static
    {
        let ideas: &Receiver<Idea> = author;
        for idea in ideas {
            if self.stamp (idea) { break; }
        }
    }

    pub fn with_capacity (size: usize) -> Book {
        Book { volumes: Vec::with_capacity (size) }
    }

    pub fn stamp (&mut self, idea: Idea) -> bool {
        match idea {
            Idea::Done => return true,
            Idea::Dawn => self.volumes.push (Volume::new ()),
            Idea::Dusk => if let Some (vol) = self.volumes.last_mut () { vol.complete () },
            idea @ _ => if let Some (vol) = self.volumes.last_mut () { vol.stamp (idea) }
        };

        false
    }
}