2012-12-10 19:32:48 -06:00
// Copyright 2012 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 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
2013-04-18 18:48:33 -05:00
// does the second one subsume the first?
// xfail-test
2012-09-19 15:59:44 -05:00
// xfail-fast
2013-04-18 18:48:33 -05:00
// notes on this test case:
// On Thu, Apr 18, 2013 at 6:30 PM, John Clements <clements@brinckerhoff.org> wrote:
// the "issue-2185.rs" test was xfailed with a ref to #2263. Issue #2263 is now fixed, so I tried it again, and after adding some &self parameters, I got this error:
2013-05-03 18:25:04 -05:00
//
2013-04-18 18:48:33 -05:00
// Running /usr/local/bin/rustc:
// issue-2185.rs:24:0: 26:1 error: conflicting implementations for a trait
// issue-2185.rs:24 impl iterable<uint> for @fn(&fn(uint)) {
// issue-2185.rs:25 fn iter(&self, blk: &fn(v: uint)) { self( |i| blk(i) ) }
// issue-2185.rs:26 }
// issue-2185.rs:20:0: 22:1 note: note conflicting implementation here
// issue-2185.rs:20 impl<A> iterable<A> for @fn(&fn(A)) {
// issue-2185.rs:21 fn iter(&self, blk: &fn(A)) { self(blk); }
// issue-2185.rs:22 }
2013-05-03 18:25:04 -05:00
//
2013-04-18 18:48:33 -05:00
// … so it looks like it's just not possible to implement both the generic iterable<uint> and iterable<A> for the type iterable<uint>. Is it okay if I just remove this test?
//
// but Niko responded:
// think it's fine to remove this test, just because it's old and cruft and not hard to reproduce. *However* it should eventually be possible to implement the same interface for the same type multiple times with different type parameters, it's just that our current trait implementation has accidental limitations.
// so I'm leaving it in.
2013-04-30 12:39:20 -05:00
// actually, it looks like this is related to bug #3429. I'll rename this bug.
2013-04-18 18:48:33 -05:00
2012-07-31 12:27:51 -05:00
// This test had to do with an outdated version of the iterable trait.
2012-04-11 23:45:18 -05:00
// However, the condition it was testing seemed complex enough to
// warrant still having a test, so I inlined the old definitions.
2012-07-31 12:27:51 -05:00
trait iterable < A > {
2013-04-18 18:48:33 -05:00
fn iter ( & self , blk : & fn ( A ) ) ;
2012-04-11 23:45:18 -05:00
}
2013-03-01 17:55:31 -06:00
impl < A > iterable < A > for @ fn ( & fn ( A ) ) {
2013-04-18 18:48:33 -05:00
fn iter ( & self , blk : & fn ( A ) ) { self ( blk ) ; }
2012-04-11 23:45:18 -05:00
}
2013-03-01 17:55:31 -06:00
impl iterable < uint > for @ fn ( & fn ( uint ) ) {
2013-04-18 18:48:33 -05:00
fn iter ( & self , blk : & fn ( v : uint ) ) { self ( | i | blk ( i ) ) }
2012-04-11 23:45:18 -05:00
}
2013-03-01 17:55:31 -06:00
fn filter < A , IA :iterable < A > > ( self : IA , prd : @ fn ( A ) -> bool , blk : & fn ( A ) ) {
2012-06-30 18:19:07 -05:00
do self . iter | a | {
2012-04-11 23:45:18 -05:00
if prd ( a ) { blk ( a ) }
}
}
2013-03-01 17:55:31 -06:00
fn foldl < A , B , IA :iterable < A > > ( self : IA , b0 : B , blk : & fn ( B , A ) -> B ) -> B {
2013-02-15 04:44:18 -06:00
let mut b = b0 ;
2012-06-30 18:19:07 -05:00
do self . iter | a | {
2013-02-15 04:44:18 -06:00
b = blk ( b , a ) ;
2012-04-11 23:45:18 -05:00
}
2013-02-15 04:44:18 -06:00
b
2012-04-11 23:45:18 -05:00
}
2012-04-23 02:25:14 -05:00
2013-03-01 17:55:31 -06:00
fn range ( lo : uint , hi : uint , it : & fn ( uint ) ) {
2012-05-26 02:32:08 -05:00
let mut i = lo ;
while i < hi {
it ( i ) ;
i + = 1 u ;
}
}
2013-02-01 21:43:17 -06:00
pub fn main ( ) {
2013-03-01 17:55:31 -06:00
let range : @ fn ( & fn ( uint ) ) = | a | range ( 0 u , 1000 u , a ) ;
let filt : @ fn ( & fn ( v : uint ) ) = | a | filter (
2012-04-11 23:45:18 -05:00
range ,
2012-06-30 18:19:07 -05:00
| & & n : uint | n % 3 u ! = 0 u & & n % 5 u ! = 0 u ,
a ) ;
let sum = foldl ( filt , 0 u , | accum , & & n : uint | accum + n ) ;
2012-04-23 02:25:14 -05:00
2012-08-22 19:24:52 -05:00
io ::println ( fmt! ( " %u " , sum ) ) ;
2012-08-10 20:15:08 -05:00
}