// 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. // ignore-fast 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<~str> { x.bind(|n| Some(*n + 1) ).bind(|n| Some(n.to_str()) ) } pub fn main() { assert_eq!(transform(Some(10)), Some(~"11")); assert_eq!(transform(None), None); assert!((vec!(~"hi")) .bind(|x| vec!(x.clone(), *x + "!") ) .bind(|x| vec!(x.clone(), *x + "?") ) == vec!(~"hi", ~"hi?", ~"hi!", ~"hi!?")); }