@Test
 public void testSize() throws Exception {
   int size = 100000;
   Byte[] bytes = new Byte[size];
   for (int i = 0; i < size; i++) {
     bytes[i] = (byte) (i % 256);
   }
   ImmutableList<Byte> byteList = list(bytes);
   assertEquals(size, byteList.size());
 }
  @Test
  public void testFilter() throws Exception {
    ImmutableList<Integer> list = list(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
    Function1<Boolean, Integer> isEven =
        new Function1<Boolean, Integer>() {
          @Override
          public Boolean evaluate(final Function1<Boolean, Integer> self, final Integer i1) {
            return i1 % 2 == 0;
          }
        };

    assertEquals(list(2, 4, 6, 8, 10), list.filter(isEven));
  }
 @Test
 public void testMap() throws Exception {
   ImmutableList<Integer> list = list(1, 2, 3);
   Function1<Integer, Integer> dbl =
       new Function1<Integer, Integer>() {
         @Override
         public Integer evaluate(final Function1<Integer, Integer> self, final Integer i1) {
           return i1 * 2;
         }
       };
   ImmutableList<Integer> doubledList = list.map(dbl);
   assertEquals(list(2, 4, 6), doubledList);
 }
  @Test
  public void testFlatMap() throws Exception {
    ImmutableList<Integer> list = list(1, 2, 3);

    // oneToN :: n -> [1..n]
    Function1<ImmutableList<Integer>, Integer> oneToN =
        new Function1<ImmutableList<Integer>, Integer>() {
          @Override
          public ImmutableList<Integer> evaluate(
              final Function1<ImmutableList<Integer>, Integer> self, final Integer i1) {
            ImmutableList<Integer> list = ImmutableList.nil();
            for (int i = i1; i >= 1; i--) {
              list = list.prepend(i);
            }
            return list;
          }
        };
    assertEquals(list(1, 1, 2, 1, 2, 3), list.flatMap(oneToN));
  }
  @Test
  public void testFold() {
    Function2<String, String, String> concat =
        new Function2<String, String, String>() {
          @Override
          public String evaluate(
              final Function2<String, String, String> self, final String i1, final String i2) {
            return i1 + i2;
          }
        };

    ImmutableList<String> list = list("a", "b", "c");
    assertEquals("dabc", list.foldLeft(concat, "d"));
    assertEquals("abcd", list.foldRight(concat, "d"));

    ImmutableList<String> emptyList = list();
    assertEquals("d", emptyList.foldLeft(concat, "d"));
    assertEquals("d", emptyList.foldRight(concat, "d"));
  }