aboutsummaryrefslogtreecommitdiff
path: root/project/QBarInterpreter/qbar_lang/io/BufferedReader.qbar
blob: 0b5c3827cfc463c32e41d7515d2545b9e937f685 (plain) (blame)
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
55
56
57
58
59
60
61
62
Import qbar/io/Reader.qbar;
Import qbar/lang/Maybe.qbar;
Import qbar/lang/System.qbar;

Namespace BufferedReader {
	Incorporate Reader;
	
	Struct BufferedReader extends Reader {
		let new BufferedReader( reader ) = do {
			this.init( reader );
			
			if reader isa Reader {
				this.reader <- reader;
			} else {
				this.reader <- new Reader( reader );
			}
			
			this.buffer <- [];
			this.bufSize <- 4096;
			this.bufCur <- 0;
			this.dbg <- 1;
			
			System.printStrLn( "START" );
			
			this.readBuffer();
		}
		
		let read = do {
			if this.bufCur == this.bufSize {
				this.readBuffer();
				this.bufCur <- 0;
			}
			
			yeild <- this.buffer#this.bufCur;
			this.bufCur <- this.bufCur + 1;
			
			return yeild;
		}
		
		let readBuffer = do {
			System.printStrLn( "Reading Buffer " ++ this.dbg );
			this.buffer <- this.readBytes( this.bufSize );
			this.dbg <- this.dbg + 1;
		}
		
		let readLine = do {
			str <- "" ++ "";
			
			i <- 0;
			while ( i <- this.read() ) != 10 {
				if i == -1 {
					return if str.length == 0 then Maybe.new Null()
								else Maybe.new Maybe( str );
				}
			
				str +< i as Character;
			}
			
			return Maybe.new Maybe(str);
		}
	}
}