diff --git a/src/librustc/front/config.rs b/src/librustc/front/config.rs index 2a5c3ae0f4f05..8d76cb893f65e 100644 --- a/src/librustc/front/config.rs +++ b/src/librustc/front/config.rs @@ -58,7 +58,7 @@ fn filter_view_item<'r>(cx: @Context, view_item: &'r ast::view_item)-> Option<&' fn fold_mod(cx: @Context, m: &ast::_mod, fld: @fold::ast_fold) -> ast::_mod { let filtered_items = do m.items.iter().filter_map |a| { - filter_item(cx, *a).chain(|x| fld.fold_item(x)) + filter_item(cx, *a).chain_move(|x| fld.fold_item(x)) }.collect(); let filtered_view_items = do m.view_items.iter().filter_map |a| { do filter_view_item(cx, a).map_move |x| { @@ -139,7 +139,7 @@ fn fold_block( fld: @fold::ast_fold ) -> ast::Block { let resulting_stmts = do b.stmts.iter().filter_map |a| { - filter_stmt(cx, *a).chain(|stmt| fld.fold_stmt(stmt)) + filter_stmt(cx, *a).chain_move(|stmt| fld.fold_stmt(stmt)) }.collect(); let filtered_view_items = do b.view_items.iter().filter_map |a| { filter_view_item(cx, a).map(|x| fld.fold_view_item(*x)) diff --git a/src/librustc/metadata/decoder.rs b/src/librustc/metadata/decoder.rs index 18446acfef6b3..468d4449b2f02 100644 --- a/src/librustc/metadata/decoder.rs +++ b/src/librustc/metadata/decoder.rs @@ -208,7 +208,7 @@ fn each_reexport(d: ebml::Doc, f: &fn(ebml::Doc) -> bool) -> bool { } fn variant_disr_val(d: ebml::Doc) -> Option { - do reader::maybe_get_doc(d, tag_disr_val).chain |val_doc| { + do reader::maybe_get_doc(d, tag_disr_val).chain_move |val_doc| { do reader::with_doc_data(val_doc) |data| { u64::parse_bytes(data, 10u) } } } diff --git a/src/librustc/middle/trans/common.rs b/src/librustc/middle/trans/common.rs index 242b15fe5f0dc..6b9bc61084fd9 100644 --- a/src/librustc/middle/trans/common.rs +++ b/src/librustc/middle/trans/common.rs @@ -505,7 +505,7 @@ impl get_node_info for ast::Block { impl get_node_info for Option<@ast::Expr> { fn info(&self) -> Option { - self.chain_ref(|s| s.info()) + self.chain(|s| s.info()) } } diff --git a/src/librustc/middle/trans/value.rs b/src/librustc/middle/trans/value.rs index 08b2db6eff9bc..af131ecfa35b6 100644 --- a/src/librustc/middle/trans/value.rs +++ b/src/librustc/middle/trans/value.rs @@ -52,7 +52,7 @@ impl Value { pub fn get_dominating_store(self, bcx: @mut Block) -> Option { match self.get_single_user().chain(|user| user.as_store_inst()) { Some(store) => { - do store.get_parent().chain |store_bb| { + do store.get_parent().chain_move |store_bb| { let mut bb = BasicBlock(bcx.llbb); let mut ret = Some(store); while *bb != *store_bb { diff --git a/src/librustc/middle/typeck/astconv.rs b/src/librustc/middle/typeck/astconv.rs index c5f85d26e4467..de606c7473bc5 100644 --- a/src/librustc/middle/typeck/astconv.rs +++ b/src/librustc/middle/typeck/astconv.rs @@ -745,7 +745,7 @@ pub fn ty_of_closure( RegionParamNames(bound_lifetime_names.clone())); let input_tys = do decl.inputs.iter().enumerate().map |(i, a)| { - let expected_arg_ty = do expected_sig.chain_ref |e| { + let expected_arg_ty = do expected_sig.chain |e| { // no guarantee that the correct number of expected args // were supplied if i < e.inputs.len() {Some(e.inputs[i])} else {None} diff --git a/src/librustpkg/version.rs b/src/librustpkg/version.rs index c2d87ddeb82bd..ad5a19d83c9a2 100644 --- a/src/librustpkg/version.rs +++ b/src/librustpkg/version.rs @@ -118,7 +118,7 @@ pub fn try_getting_local_version(local_path: &Path) -> Option { if !l.is_whitespace() { output = Some(l); } - match output.chain(try_parsing_version) { + match output.chain_move(try_parsing_version) { Some(v) => return Some(v), None => () } @@ -158,7 +158,7 @@ pub fn try_getting_version(remote_path: &Path) -> Option { } } - output.chain(try_parsing_version) + output.chain_move(try_parsing_version) } else { None diff --git a/src/libstd/iter.rs b/src/libstd/iter.rs index 5ca827350d01e..2de42888cdfde 100644 --- a/src/libstd/iter.rs +++ b/src/libstd/iter.rs @@ -1474,7 +1474,7 @@ pub struct Scan<'self, A, B, T, St> { impl<'self, A, B, T: Iterator, St> Iterator for Scan<'self, A, B, T, St> { #[inline] fn next(&mut self) -> Option { - self.iter.next().chain(|a| (self.f)(&mut self.state, a)) + self.iter.next().chain_move(|a| (self.f)(&mut self.state, a)) } #[inline] @@ -1505,7 +1505,7 @@ impl<'self, A, T: Iterator, B, U: Iterator> Iterator for } } match self.iter.next().map_move(|x| (self.f)(x)) { - None => return self.backiter.chain_mut_ref(|it| it.next()), + None => return self.backiter.chain_mut(|it| it.next()), next => self.frontiter = next, } } @@ -1537,7 +1537,7 @@ impl<'self, } } match self.iter.next_back().map_move(|x| (self.f)(x)) { - None => return self.frontiter.chain_mut_ref(|it| it.next_back()), + None => return self.frontiter.chain_mut(|it| it.next_back()), next => self.backiter = next, } } diff --git a/src/libstd/option.rs b/src/libstd/option.rs index be81f2e92d781..81e11401ad6f3 100644 --- a/src/libstd/option.rs +++ b/src/libstd/option.rs @@ -165,20 +165,10 @@ impl Option { } } - /// Update an optional value by optionally running its content through a - /// function that returns an option. - #[inline] - pub fn chain(self, f: &fn(T) -> Option) -> Option { - match self { - Some(t) => f(t), - None => None - } - } - /// Update an optional value by optionally running its content by reference /// through a function that returns an option. #[inline] - pub fn chain_ref<'a, U>(&'a self, f: &fn(x: &'a T) -> Option) -> Option { + pub fn chain<'a, U>(&'a self, f: &fn(x: &'a T) -> Option) -> Option { match *self { Some(ref x) => f(x), None => None @@ -188,13 +178,23 @@ impl Option { /// Update an optional value by optionally running its content by mut reference /// through a function that returns an option. #[inline] - pub fn chain_mut_ref<'a, U>(&'a mut self, f: &fn(x: &'a mut T) -> Option) -> Option { + pub fn chain_mut<'a, U>(&'a mut self, f: &fn(x: &'a mut T) -> Option) -> Option { match *self { Some(ref mut x) => f(x), None => None } } + /// Update an optional value by optionally running its content through a + /// function that returns an option. + #[inline] + pub fn chain_move(self, f: &fn(T) -> Option) -> Option { + match self { + Some(t) => f(t), + None => None + } + } + /// Filters an optional value using given function. #[inline(always)] pub fn filtered(self, f: &fn(t: &T) -> bool) -> Option { diff --git a/src/libstd/rt/io/net/ip.rs b/src/libstd/rt/io/net/ip.rs index 956dd08ac91f0..28217787657db 100644 --- a/src/libstd/rt/io/net/ip.rs +++ b/src/libstd/rt/io/net/ip.rs @@ -177,7 +177,7 @@ impl<'self> Parser<'self> { } do self.read_atomically |p| { - p.read_char().chain(|c| parse_digit(c, radix)) + p.read_char().chain_move(|c| parse_digit(c, radix)) } } diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs index 2cebae550fd56..67b72ecb54d1a 100644 --- a/src/libsyntax/ext/expand.rs +++ b/src/libsyntax/ext/expand.rs @@ -331,11 +331,11 @@ pub fn expand_item_mac(extsbox: @mut SyntaxEnv, }; let maybe_it = match expanded { - MRItem(it) => mark_item(it,fm).chain(|i| {fld.fold_item(i)}), + MRItem(it) => mark_item(it,fm).chain_move(|i| {fld.fold_item(i)}), MRExpr(_) => cx.span_fatal(pth.span, fmt!("expr macro in item position: %s", extnamestr)), - MRAny(_, item_maker, _) => item_maker().chain(|i| {mark_item(i,fm)}) - .chain(|i| {fld.fold_item(i)}), + MRAny(_, item_maker, _) => item_maker().chain_move(|i| {mark_item(i,fm)}) + .chain_move(|i| {fld.fold_item(i)}), MRDef(ref mdef) => { // yikes... no idea how to apply the mark to this. I'm afraid // we're going to have to wait-and-see on this one.