// Path: src/main/java/org/gololang/microbenchmarks/filtermapreduce/JavaCopyingFilterMapReduce.java
// public class JavaCopyingFilterMapReduce {
// 
//   public static interface Predicate {
//     boolean apply(Object object);
//   }
// 
//   public static interface Function {
//     Object apply(Object a);
//   }
// 
//   public static interface BiFunction {
//     Object apply(Object a, Object b);
//   }
// 
//   public static Collection<Object> newWithSameType(Collection<?> collection) {
//     if (collection instanceof RandomAccess) {
//       return new ArrayList<>();
//     } else if (collection instanceof List) {
//       return new LinkedList<>();
//     } else if (collection instanceof Set) {
//       return new HashSet<>();
//     } else {
//       throw new RuntimeException("Not a supported collection: " + collection.getClass());
//     }
//   }
// 
//   public static Collection<?> filter(Collection<?> collection, Predicate predicate) {
//     Collection<Object> result = newWithSameType(collection);
//     for (Object obj : collection) {
//       if (predicate.apply(obj)) {
//         result.add(obj);
//       }
//     }
//     return result;
//   }
// 
//   public static Collection<?> map(Collection<?> collection, Function fun) {
//     Collection<Object> result = newWithSameType(collection);
//     for (Object obj : collection) {
//       result.add(fun.apply(obj));
//     }
//     return result;
//   }
// 
//   public static Object reduce(Collection<?> collection, Object initialValue, BiFunction reducer) {
//     Object result = initialValue;
//     for (Object obj : collection) {
//       result = reducer.apply(result, obj);
//     }
//     return result;
//   }
// }


import org.junit.Test;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
import static org.gololang.microbenchmarks.filtermapreduce.JavaCopyingFilterMapReduce.*;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
/*
 * Copyright 2012-2016 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.gololang.microbenchmarks.filtermapreduce;




public class JavaCopyingFilterMapReduceTest {

  @Test
  public void test_newWithSameType() throws Exception {
    assertEquals(ArrayList.class, newWithSameType(new ArrayList<>()).getClass());
    assertEquals(LinkedList.class, newWithSameType(new LinkedList<>()).getClass());
    assertEquals(HashSet.class, newWithSameType(new HashSet<>()).getClass());
  }

  @Test
  public void test_filter() throws Exception {
    ArrayList<Object> list = new ArrayList<Object>() {
      {
        add(1);
        add(2);
        add(3);
      }
    };
// Path: src/main/java/org/gololang/microbenchmarks/filtermapreduce/JavaCopyingFilterMapReduce.java
// public class JavaCopyingFilterMapReduce {
// 
//   public static interface Predicate {
//     boolean apply(Object object);
//   }
// 
//   public static interface Function {
//     Object apply(Object a);
//   }
// 
//   public static interface BiFunction {
//     Object apply(Object a, Object b);
//   }
// 
//   public static Collection<Object> newWithSameType(Collection<?> collection) {
//     if (collection instanceof RandomAccess) {
//       return new ArrayList<>();
//     } else if (collection instanceof List) {
//       return new LinkedList<>();
//     } else if (collection instanceof Set) {
//       return new HashSet<>();
//     } else {
//       throw new RuntimeException("Not a supported collection: " + collection.getClass());
//     }
//   }
// 
//   public static Collection<?> filter(Collection<?> collection, Predicate predicate) {
//     Collection<Object> result = newWithSameType(collection);
//     for (Object obj : collection) {
//       if (predicate.apply(obj)) {
//         result.add(obj);
//       }
//     }
//     return result;
//   }
// 
//   public static Collection<?> map(Collection<?> collection, Function fun) {
//     Collection<Object> result = newWithSameType(collection);
//     for (Object obj : collection) {
//       result.add(fun.apply(obj));
//     }
//     return result;
//   }
// 
//   public static Object reduce(Collection<?> collection, Object initialValue, BiFunction reducer) {
//     Object result = initialValue;
//     for (Object obj : collection) {
//       result = reducer.apply(result, obj);
//     }
//     return result;
//   }
// }


// Path: src/test/java/org/gololang/microbenchmarks/filtermapreduce/JavaCopyingFilterMapReduceTest.java
import org.junit.Test;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
import static org.gololang.microbenchmarks.filtermapreduce.JavaCopyingFilterMapReduce.*;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;

/*
 * Copyright 2012-2016 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.gololang.microbenchmarks.filtermapreduce;




public class JavaCopyingFilterMapReduceTest {

  @Test
  public void test_newWithSameType() throws Exception {
    assertEquals(ArrayList.class, newWithSameType(new ArrayList<>()).getClass());
    assertEquals(LinkedList.class, newWithSameType(new LinkedList<>()).getClass());
    assertEquals(HashSet.class, newWithSameType(new HashSet<>()).getClass());
  }

  @Test
  public void test_filter() throws Exception {
    ArrayList<Object> list = new ArrayList<Object>() {
      {
        add(1);
        add(2);
        add(3);
      }
    };
    Collection<?> result = filter(list, new JavaCopyingFilterMapReduce.Predicate() {