package l8er;

import static com.googlecode.totallylazy.Option.none;
import static com.googlecode.totallylazy.Sequences.sequence;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;

import org.junit.Test;

import com.googlecode.totallylazy.Callable1;
import com.googlecode.totallylazy.Callable2;
import com.googlecode.totallylazy.Predicate;

public class TotallyLazy {

	private static final Predicate<Integer> even = n -> (n & 1) != 1;
	private static final Predicate<Integer> odd = n -> !even.matches(n);
	private static final Callable1<Integer, String> toString = String::valueOf;
	private static final Callable2<Integer, Integer, Integer> sum = (n, m) -> n + m;
	private static final Callable2<Integer, Integer, Integer> add = sum;

	@Test
	public void examples() {
		assertThat(sequence(1, 2, 3, 4).filter(even), is(sequence(2, 4)));
		assertThat(sequence(1, 2).map(toString), is(sequence("1", "2")));
		assertThat(sequence(1, 2).mapConcurrently(toString), is(sequence("1", "2")));
		assertThat(sequence(1, 2, 3).take(2), is(sequence(1, 2)));
		assertThat(sequence(1, 2, 3).drop(2), is(sequence(3)));
		assertThat(sequence(1, 2, 3).tail(), is(sequence(2, 3)));
		assertThat(sequence(1, 2, 3).head(), is(1));
		assertThat(sequence(1, 2, 3).reduce(sum), is(6));
		assertThat(sequence(1, 3, 5).find(even), is(none()));
		assertTrue(sequence(1, 2, 3).contains(2));
		assertTrue(sequence(1, 2, 3).exists(even));
		assertFalse(sequence(1, 2, 3).forAll(odd));
		assertThat(sequence(1, 2, 3).foldLeft(0, add), is(6));
		assertThat(sequence(1, 2, 3).toString(), is("1,2,3"));
		assertThat(sequence(1, 2, 3).toString(":"), is("1:2:3"));

	}
}

@@ -321,53 +321,8 @@
 t;%0A%0A
-import com.googlecode.totallylazy.Callable1;%0A
 impo
@@ -435,26 +435,17 @@
 yLazy %7B%0A
-%0A%09private 
+%09
 static f
@@ -495,24 +495,16 @@
  != 1;%0A%09
-private 
 static f
@@ -561,93 +561,8 @@
 );%0A%09
-private static final Callable1%3CInteger, String%3E toString = String::valueOf;%0A%09private 
 stat
@@ -635,16 +635,8 @@
 m;%0A%09
-private 
 stat
@@ -827,24 +827,31 @@
  2).map(
-to
 String
+::valueOf
 ), is(se
@@ -914,24 +914,31 @@
 rrently(
-to
 String
+::valueOf
 ), is(se
@@ -1602,14 +1602,13 @@
 2:3%22));%0A
-%0A
 %09%7D%0A%7D%0A

Use method reference