package com.github.blindpirate.gogradle.util;

import java.util.Optional;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

public class CollectionUtils {
    public static <T> List<T> immutableList(T... elements) {
        return Collections.unmodifiableList(Arrays.asList(elements));
    }

    public static <T> List<T> collectOptional(Optional<T>... optionals) {
        List<T> ret = new ArrayList<>();
        for (Optional<T> optional : optionals) {
            if (optional.isPresent()) {
                ret.add(optional.get());
            }
        }

        return ret;
    }

    public static <T> List<T> flatten(List<T>... lists) {
        List<T> result = new ArrayList<>();
        for (List<T> list : lists) {
            result.addAll(list);
        }
        return result;
    }

    public static <T> boolean isEmpty(Collection<T> c) {
        return c == null || c.isEmpty();
    }

    public static <T> T findFirst(Collection<T> c) {
        for (T element : c) {
            return element;
        }
        return null;
    }

}

@@ -51,26 +51,56 @@
 ort 
-java.util.Optional
+org.codehaus.groovy.runtime.DefaultGroovyMethods
 ;%0A%0Ai
@@ -143,21 +143,26 @@
 va.util.
-Array
+Collection
 s;%0Aimpor
@@ -177,27 +177,49 @@
 til.
-Collection;
+List;%0Aimport java.util.Optional;%0A
 %0Aimport 
 java
@@ -206,32 +206,39 @@
 tional;%0A%0Aimport 
+static 
 java.util.Collec
@@ -227,35 +227,37 @@
 c java.util.
-Collections
+Arrays.asList
 ;%0Aimport jav
@@ -245,32 +245,39 @@
 .asList;%0Aimport 
+static 
 java.util.List;%0A
@@ -270,20 +270,29 @@
 va.util.
-List
+Arrays.stream
 ;%0A%0Apubli
@@ -422,23 +422,16 @@
 bleList(
-Arrays.
 asList(e
@@ -534,22 +534,57 @@
     
-List%3CT%3E ret = 
+return stream(optionals)%0A                .reduce(
 new 
@@ -588,33 +588,33 @@
 ew ArrayList%3C%3E()
-;
+,
 %0A        for (Op
@@ -610,35 +610,30 @@
     
-for (Optional%3CT%3E optional :
+                (list,
  opt
@@ -629,37 +629,46 @@
  (list, optional
-s
 ) 
-%7B%0A
+-%3E %7B%0A       
             if (
@@ -663,16 +663,25 @@
         
+         
 if (opti
@@ -716,18 +716,35 @@
         
-re
+                lis
 t.add(op
@@ -770,26 +770,24 @@
         
-%7D%0A
         
 %7D%0A%0A     
@@ -782,19 +782,16 @@
     
-%7D%0A%0A
         
 retu
@@ -790,198 +790,77 @@
     
-return ret;%0A    %7D%0A%0A    public static %3CT%3E List%3CT%3E flatten(List%3CT%3E... lists) %7B%0A        List%3CT%3E result = new ArrayList%3C%3E();%0A        for (List%3CT%3E list : lists) %7B%0A            result.addAll(list);
+%7D%0A                            return list;%0A                        %7D,
 %0A   
@@ -860,34 +860,32 @@
  %7D,%0A        
-%7D%0A
         
 return resul
@@ -876,282 +876,212 @@
     
-return result;%0A    %7D%0A%0A    public static %3CT%3E boolean isEmpty(Collection%3CT%3E c) %7B
+        Functions.returnFirstArg());
 %0A    
+%7D%0A%0A
     
-return c == null %7C%7C c.isEmpty();%0A    %7D%0A%0A    public static %3CT%3E T findFirst(Collection%3CT%3E c) %7B%0A        for (T element : c) %7B%0A            return element;%0A        %7D%0A        return null
+@SuppressWarnings(%22unchecked%22)%0A    public static %3CT%3E List%3CT%3E flatten(List%3CT%3E... lists) %7B%0A        return (List%3CT%3E) DefaultGroovyMethods.flatten(lists)
 ;%0A    %7D%0A
 %0A%7D%0A
@@ -1077,11 +1077,10 @@
 ;%0A    %7D%0A
-%0A
 %7D%0A

switch to java8