// Copyright (c) 2013-2016, febit.org. All Rights Reserved.
package org.febit.wit;

import java.util.Map;

/**
 *
 * @author zqq90
 * @since 2.4.0
 */
@FunctionalInterface
public interface Vars {

    public static final Vars EMPTY = (accepter) -> {
        // Do nothing
    };

    @FunctionalInterface
    public static interface Accepter {

        void set(String key, Object value);
    }

    public static Vars of(final Vars v1, final Vars v2) {
        return (accepter) -> {
            v1.exportTo(accepter);
            v2.exportTo(accepter);
        };
    }

    public static Vars of(final Vars... values) {
        if (values == null || values.length == 0) {
            return Vars.EMPTY;
        }
        return (accepter) -> {
            for (Vars item : values) {
                item.exportTo(accepter);
            }
        };
    }

    public static Vars of(final String key, final Object value) {
        return (accepter) -> {
            accepter.set(key, value);
        };
    }

    public static Vars of(final String[] keys, final Object[] values) {
        if (keys == null || values == null) {
            return Vars.EMPTY;
        }
        final int size = Math.min(keys.length, values.length);
        if (size == 0) {
            return Vars.EMPTY;
        }
        return (accepter) -> {
            final String[] mykeys = keys;
            final Object[] myValues = values;
            for (int i = 0; i < size; i++) {
                accepter.set(mykeys[i], myValues[i]);
            }
        };
    }

    public static Vars of(final Map<String, Object> map) {
        if (map == null || map.isEmpty()) {
            return Vars.EMPTY;
        }
        return (accepter) -> {
            map.entrySet().forEach((entry) -> {
                accepter.set(entry.getKey(), entry.getValue());
            });
        };
    }

    void exportTo(Accepter accepter);

}

@@ -227,25 +227,24 @@
 EMPTY = 
-(
 accepter
 ) -%3E %7B%0A 
@@ -227,33 +227,32 @@
 EMPTY = accepter
-)
  -%3E %7B%0A        //
@@ -379,32 +379,75 @@
  value);%0A    %7D%0A%0A
+    /**%0A     *%0A     * @since 2.5.0%0A     */%0A
     public stati
@@ -499,33 +499,32 @@
      return 
-(
 accepter
 ) -%3E %7B%0A     
@@ -503,33 +503,32 @@
  return accepter
-)
  -%3E %7B%0A          
@@ -597,32 +597,75 @@
       %7D;%0A    %7D%0A%0A
+    /**%0A     *%0A     * @since 2.5.0%0A     */%0A
     public stati
@@ -802,33 +802,32 @@
      return 
-(
 accepter
 ) -%3E %7B%0A     
@@ -806,33 +806,32 @@
  return accepter
-)
  -%3E %7B%0A          
@@ -924,32 +924,75 @@
       %7D;%0A    %7D%0A%0A
+    /**%0A     *%0A     * @since 2.5.0%0A     */%0A
     public stati
@@ -1052,33 +1052,32 @@
      return 
-(
 accepter
 ) -%3E %7B%0A     
@@ -1064,34 +1064,19 @@
 accepter
-)
  -%3E
- %7B%0A           
  accepte
@@ -1094,37 +1094,69 @@
 value);%0A    
+%7D%0A%0A
     
-%7D;
+/**
 %0A    
-%7D%0A
+ *%0A     * @since 2.5.0%0A     */
 %0A    public 
@@ -1443,33 +1443,32 @@
      return 
-(
 accepter
 ) -%3E %7B%0A     
@@ -1459,103 +1459,14 @@
 pter
-)
  -%3E %7B%0A
-            final String%5B%5D mykeys = keys;%0A            final Object%5B%5D myValues = values;%0A
     
@@ -1535,18 +1535,16 @@
 ter.set(
-my
 keys%5Bi%5D,
@@ -1548,11 +1548,9 @@
 i%5D, 
-myV
+v
 alue
@@ -1584,24 +1584,67 @@
   %7D;%0A    %7D%0A%0A
+    /**%0A     *%0A     * @since 2.5.0%0A     */%0A
     public s
@@ -1790,25 +1790,24 @@
  return 
-(
 accepter
 ) -%3E %7B%0A 
@@ -1802,87 +1802,32 @@
 pter
-)
  -%3E 
-%7B%0A            map.entrySet().forEach((entry) -%3E %7B%0A                
+map.forEach(
 accepter
 .set
@@ -1826,73 +1826,14 @@
 pter
-.set(entry.getKey(), entry.getValue());%0A            %7D);%0A        %7D
+::set)
 ;%0A  

update Vars