chapter 7 tr suggestions

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

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

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

Loading…
Cancel
Save