chapter 7 tr suggestions

master
Andrew Johnson 6 years ago
parent 536ea812a2
commit 22f8cd6c66

@ -1,7 +1,7 @@
#[macro_use]
extern crate chomp;
use chomp::prelude::*;
use std::sync::{Arc,Mutex};
use std::rc::Rc;
#[derive(Debug, Eq, PartialEq)]
struct Name<B: Buffer> {
@ -25,7 +25,7 @@ fn name<I: U8Input>(i: I) -> SimpleResult<I, Name<I::Buffer>> {
#[derive(Clone)]
struct ParseState<A: Clone> {
buffer: Arc<Mutex<Vec<char>>>,
buffer: Rc<Vec<char>>,
index: usize,
a: A
}
@ -33,24 +33,23 @@ impl<A: Clone> ParseState<A> {
fn new(a: A, buffer: String) -> ParseState<A> {
let buffer: Vec<char> = buffer.chars().collect();
ParseState {
buffer: Arc::new(Mutex::new(buffer)),
buffer: Rc::new(buffer),
index: 0,
a: a
}
}
fn next(&self) -> (ParseState<A>,Option<char>) {
let buf = self.buffer.lock().unwrap();
if self.index < buf.len() {
let new_char = buf[self.index];
if self.index < self.buffer.len() {
let new_char = self.buffer[self.index];
let new_index = self.index + 1;
(ParseState {
buffer: Arc::clone(&self.buffer),
buffer: Rc::clone(&self.buffer),
index: new_index,
a: self.a.clone()
}, Some(new_char))
} else {
(ParseState {
buffer: Arc::clone(&self.buffer),
buffer: Rc::clone(&self.buffer),
index: self.index,
a: self.a.clone()
},None)

@ -1,24 +1,24 @@
use std::rc::Rc;
use std::sync::{Arc,Mutex};
#[derive(Clone)]
struct LazyList<A: Clone> {
buffer: Arc<Mutex<Vec<A>>>,
buffer: Rc<Vec<A>>,
index: usize
}
impl<A: Clone> LazyList<A> {
fn new(buf: Vec<A>) -> LazyList<A> {
LazyList {
buffer: Arc::new(Mutex::new(buf)),
buffer: Rc::new(buf),
index: 0
}
}
fn next(&self) -> Option<(LazyList<A>,A)> {
let buf = self.buffer.lock().unwrap();
if self.index < buf.len() {
let new_item = buf[self.index].clone();
if self.index < self.buffer.len() {
let new_item = self.buffer[self.index].clone();
let new_index = self.index + 1;
Some((LazyList {
buffer: Arc::clone(&self.buffer),
buffer: Rc::clone(&self.buffer),
index: new_index
},new_item))
} else {
@ -63,7 +63,7 @@ impl<St: 'static,A: 'static,B: 'static> ReactiveUnit<St,A,B> {
})
}
}
fn rbind<St2: 'static,C: 'static>(&self, other: ReactiveUnit<St2,B,C>) -> ReactiveUnit<(Arc<Mutex<St>>,Arc<Mutex<St2>>),A,C> {
fn plus<St2: 'static,C: 'static>(&self, other: ReactiveUnit<St2,B,C>) -> ReactiveUnit<(Arc<Mutex<St>>,Arc<Mutex<St2>>),A,C> {
let ev1 = Arc::clone(&self.event_handler);
let st1 = Arc::clone(&self.state);
let ev2 = Arc::clone(&other.event_handler);

Loading…
Cancel
Save