| 1 package jfun.yan.xml.nuts.optional; 2 3 import java.lang.reflect.Array ; 4 import java.util.Collection ; 5 import java.util.Iterator ; 6 7 import jfun.yan.Binder; 8 import jfun.yan.Components; 9 import jfun.yan.Creator; 10 import jfun.yan.Monad; 11 import jfun.yan.xml.nuts.DelegatingBinderNut; 12 13 24 public class ForeachNut extends DelegatingBinderNut { 25 public Binder eval() throws Exception { 26 final Binder binder = getMandatory(); 27 return new Binder(){ 28 public Creator bind(Object v) 29 throws Throwable { 30 if(v==null) return Components.value(null); 31 final Creator[] steps = getNextSteps(v, binder); 32 return Monad.sequence(steps); 33 } 34 public String toString(){ 35 return "foreach"; 36 } 37 }; 38 } 39 private static Creator[] getNextSteps(Object obj, Binder next) 40 throws Throwable { 41 if(obj instanceof java.util.Map ){ 42 return getNextSteps((java.util.Map )obj, next); 43 } 44 else if(obj instanceof Object []){ 45 return getNextSteps((Object [])obj, next); 46 } 47 else if(obj instanceof Collection ){ 48 return getNextSteps((Collection )obj, next); 49 } 50 else if(obj.getClass().isArray()){ 51 return getNextStepsForArray(obj, next); 52 } 53 else{ 54 return new Creator[]{next.bind(obj)}; 55 } 56 } 57 private static Creator[] getNextStepsForArray(Object arr, Binder next) 58 throws Throwable { 59 final int sz = Array.getLength(arr); 60 final Creator[] result = new Creator[sz]; 61 for(int i=0; i<sz ;i++){ 62 result[i] = next.bind(Array.get(arr, i)); 63 } 64 return result; 65 } 66 67 private static Creator[] getNextSteps(Object [] arr, Binder next) 68 throws Throwable { 69 final Creator[] result = new Creator[arr.length]; 70 for(int i=0; i<arr.length ;i++){ 71 result[i] = next.bind(arr[i]); 72 } 73 return result; 74 } 75 private static Creator[] getNextSteps(java.util.Map m, Binder next) 76 throws Throwable { 77 return getNextSteps(m.values(), next); 78 } 79 private static Creator[] getNextSteps(Collection c, Binder next) 80 throws Throwable { 81 final Creator[] result = new Creator[c.size()]; 82 int i=0; 83 for(Iterator it = c.iterator(); it.hasNext();i++){ 84 result[i] = next.bind(it.next()); 85 } 86 return result; 87 } 88 } 89 | Popular Tags |