server semi-monad

master
Andrew Johnson 6 years ago
parent 6b13c69293
commit aed2af852e

@ -6,25 +6,36 @@ use std::thread;
struct ServerMonad<St> {
state: St,
handle: Box<Fn(&mut St,String) -> bool>
handlers: Vec<Box<Fn(&mut St,&String) -> Option<String>>>
}
impl<St: Clone> ServerMonad<St> {
fn _return(&self, st: St) -> ServerMonad<St> {
fn _return(st: St) -> ServerMonad<St> {
ServerMonad {
state: st,
handle: Box::new(|st: &mut St, s| false)
handlers: Vec::new()
}
}
fn listen(&self, address: &str) {
fn listen(&mut self, address: &str) {
let listener = TcpListener::bind(address).unwrap();
for stream in listener.incoming() {
let mut st = self.state.clone();
let mut buffer = String::new();
stream.unwrap().read_to_string(&mut buffer);
(self.handle)(&mut st,buffer);
let mut buffer = [0; 2048];
let mut tcp = stream.unwrap();
tcp.read(&mut buffer);
let buffer = String::from_utf8_lossy(&buffer).into_owned();
for h in self.handlers.iter() {
if let Some(response) = h(&mut st,&buffer) {
tcp.write(response.as_bytes());
break
}
}
}
}
fn bind_handler<F>(mut self, f: F) -> Self
where F: 'static + Fn(&mut St,&String) -> Option<String> {
self.handlers.push(Box::new(f));
self
}
}
struct LogMonad<T>(T);
@ -84,5 +95,12 @@ fn main()
.bind(|z| format!("{}{}", z, z));
let nowdoit = notyet.apply(222);
println!("nowdoit {}", nowdoit)
println!("nowdoit {}", nowdoit);
ServerMonad::_return(())
.bind_handler(|&mut st, ref msg| if msg.len()%2 == 0 { Some("divisible by 2".to_string()) } else { None })
.bind_handler(|&mut st, ref msg| if msg.len()%3 == 0 { Some("divisible by 3".to_string()) } else { None })
.bind_handler(|&mut st, ref msg| if msg.len()%5 == 0 { Some("divisible by 5".to_string()) } else { None })
.bind_handler(|&mut st, ref msg| if msg.len()%7 == 0 { Some("divisible by 7".to_string()) } else { None })
.listen("127.0.0.1:8888");
}

Loading…
Cancel
Save