// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. trait vec_monad { fn bind(&self, f: |&A| -> Vec ) -> Vec ; } impl vec_monad for Vec { fn bind(&self, f: |&A| -> Vec ) -> Vec { let mut r = Vec::new(); for elt in self.iter() { r.push_all_move(f(elt)); } r } } trait option_monad { fn bind(&self, f: |&A| -> Option) -> Option; } impl option_monad for Option { fn bind(&self, f: |&A| -> Option) -> Option { match *self { Some(ref a) => { f(a) } None => { None } } } } fn transform(x: Option) -> Option { x.bind(|n| Some(*n + 1) ).bind(|n| Some(n.to_str().to_string()) ) } pub fn main() { assert_eq!(transform(Some(10)), Some("11".to_string())); assert_eq!(transform(None), None); assert!((vec!("hi".to_string())) .bind(|x| vec!(x.clone(), format_strbuf!("{}!", x)) ) .bind(|x| vec!(x.clone(), format_strbuf!("{}?", x)) ) == vec!("hi".to_string(), "hi?".to_string(), "hi!".to_string(), "hi!?".to_string())); }