Added improved Generics support so it can be more verbose, but it is better. Also improved organization and class hierarchy. Got rid of some evolutionary dead ends.
Example
package com.examples; import static com.easyjava.EasyJava.*; import java.util.*; public class Example { @SuppressWarnings({"unchecked", "unused"}) public static void main(String [] args) { Map<String, Integer> tel; //tel = {'jack': 4098, 'sape': 4139} tel = mp("jack", 4098, "sape", 4139); //tel['guido'] = 4127 tel.put("guido", 4127); //print (tel) print(tel); //Output {'sape': 4139, 'guido': 4127, 'jack': 4098} // print (tel['jack']) print(tel.get("jack")); //Output 4098 // del tel['sape'] tel.remove("sape"); // tel['irv'] = 4127 tel.put("irv", 4127); // print(tel) print(tel); // Output {'guido': 4127, 'irv': 4127, 'jack': 4098} // print(tel.keys()) print (tel.keySet()); // Output ['guido', 'irv', 'jack'] // 'guido' in tel print (tel.containsKey("guido")); // Output True // tel = dict([('sape', 4139), ('guido', 4127), ('jack', 4098)]) tel = dict(kv("sape", 4139), kv("guido", 4127), kv("jack", 4098)); //get unchecked exception for Java 6 but not Java 7 // print (tel) print(tel); // Output {'sape': 4139, 'jack': 4098, 'guido': 4127} //List Comprehension Class <?> c = Example.class; // print( dict([(x, x**2) for x in (2, 4, 6)]) ) # use a list comprehension // Output {2: 4, 4: 16, 6: 36} print (map(fn(c, "pow2"), list(2, 4, 6))); // >>> for i, v in enumerate(['tic', 'tac', 'toe']): // ... print i, v // ... // 0 tic // 1 tac // 2 toe enumerate(fn(c, s.printItem), list("tic", "tac", "toe")); //You can also declare functions on the fly like so class Foo { void printItem(int i, String v) { print("foo", i , v); } } enumerate(fn(new Foo(), s.printItem), list("tic", "tac", "toe")); // >>> def f(x): return x % 2 != 0 and x % 3 != 0 // ... // >>> filter(f, range(2, 25)) // [5, 7, 11, 13, 17, 19, 23] class Filter { boolean f(int x) { return x % 2 != 0 && x % 3 != 0; } } print (filter(f(new Filter()), range(2, 25))); Collection<?> objitems = filter(f(new Filter()), range(2, 25)); Collection<Integer> myitems = gfilter(f(new Filter()), range(2, 25)); print (myitems, objitems); // >>> def cube(x): return x*x*x // ... // >>> map(cube, range(1, 11)) // [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000] print (map(fn(c, s.cube), range(1,11))); List<?> list = map(fn(c, s.cube), range(1,11)); List<String> gmap = gmap(fn(String.class, c, s.stringize), range(1,11)); print (list, gmap); // >>> def add(x,y): return x+y // ... // >>> reduce(add, range(1, 11)) // 55 print ( reduce(fn(c,s.add), range(1,11)) ); Object object = reduce(fn(c,s.add), range(1,11)); int greduce = greduce(fn(Integer.class, c,s.add), range(1,11)); int greduce2 = greduce(fn(c,s.add), range(1,11)); print(object, greduce, greduce2); } static int add(int x, int y) { return x + y; } static int cube(int i) { return i * i * i; } static int pow2(int i) { return i * i; } static String stringize(int i) { switch (i) { case 1: return "one"; case 2: return "two"; case 3: return "three"; default: return "" +i; } } static void printItem(int i, String v) { print(i , v); } static enum s {printItem, cube, add, stringize}; }
Implementation
package com.easyjava; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.ListIterator; import java.util.Map; import java.util.HashMap; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; public class EasyJava { private static Logger log = Logger.getLogger(EasyJava.class.getName()); // HELPER // HELPER // HELPER // HELPER private static Class<?> clazz(Object that) { if (that instanceof Class) { return (Class<?>) that; } else { return that.getClass(); } } public static void print (Object... items) { StringBuilder builder = new StringBuilder(256); for (Object item : items) { builder.append(item); builder.append(' '); } System.out.println(builder); } @SuppressWarnings("serial") public static class AssertionException extends RuntimeException { public AssertionException() { super(); } public AssertionException(String message, Throwable cause) { super(message, cause); } public AssertionException(String message) { super(message); } public AssertionException(Throwable cause) { super(cause); } } @SuppressWarnings("serial") public static class ReflectionException extends RuntimeException { public ReflectionException() { super(); } public ReflectionException(String message, Throwable cause) { super(message, cause); } public ReflectionException(String message) { super(message); } public ReflectionException(Throwable cause) { super(cause); } } public static void die(boolean condition, String message) { if (condition) { throw new AssertionException(message); } } public static void die(String message) { throw new AssertionException(message); } public static void die(String message, Object... args) { throw new AssertionException(String.format(message, args)); } // CREATIONAL // CREATIONAL // CREATIONAL // CREATIONAL public static interface Entry<K,V> { K key(); V value(); } private static class EntryImpl<K, V> implements Entry<K, V>{ EntryImpl(K k, V v) {this.k=k; this.v=v;} K k; V v; @Override public K key() { return k; } @Override public V value() { return v; } } public static <K, V> Entry<K, V> kv (final K k, final V v) { return new EntryImpl<K,V>(k, v); } public static <K, V> Entry <K, V> entry (final K k, final V v) { return new EntryImpl<K,V>(k,v); } public static <V> List<V> list(final V... array) { return Arrays.asList(array); } public static <V> Set<V> set(final V... array) { return new HashSet<V>(list(array)); } public static List<Integer> range(int stop) { return range(0, stop); } public static List<Integer> range(int start, int stop) { ArrayList<Integer> range = new ArrayList<Integer>(stop-start); for (int index=start; index<stop; index++) { range.add(index); } return range; } public static List<Integer> range(int start, int stop, int inc) { ArrayList<Integer> range = new ArrayList<Integer>(stop-start); for (int index=start; index<stop; index+=inc) { range.add(index); } return range; } public static <K, V> Map<K, V> mp(K k0, V v0) { HashMap<K, V> map = new HashMap<K, V>(10); map.put(k0, v0); return map; } public static <K, V> Map<K, V> mp(K k0, V v0, K k1, V v1) { HashMap<K, V> map = new HashMap<K, V>(10); map.put(k0, v0); map.put(k1, v1); return map; } public static <K, V> Map<K, V> mp(K k0, V v0, K k1, V v1, K k2, V v2) { HashMap<K, V> map = new HashMap<K, V>(10); map.put(k0, v0); map.put(k1, v1); map.put(k2, v2); return map; } public static <K, V> Map<K, V> mp(K k0, V v0, K k1, V v1, K k2, V v2, K k3, V v3) { HashMap<K, V> map = new HashMap<K, V>(10); map.put(k0, v0); map.put(k1, v1); map.put(k2, v2); map.put(k3, v3); return map; } public static <K, V> Map<K, V> mp(K k0, V v0, K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4) { HashMap<K, V> map = new HashMap<K, V>(10); map.put(k0, v0); map.put(k1, v1); map.put(k2, v2); map.put(k3, v3); map.put(k4, v4); return map; } public static <K, V> Map<K, V> mp(K k0, V v0, K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5) { HashMap<K, V> map = new HashMap<K, V>(10); map.put(k0, v0); map.put(k1, v1); map.put(k2, v2); map.put(k3, v3); map.put(k4, v4); map.put(k5, v5); return map; } public static <K, V> Map<K, V> mp(K k0, V v0, K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6) { HashMap<K, V> map = new HashMap<K, V>(10); map.put(k0, v0); map.put(k1, v1); map.put(k2, v2); map.put(k3, v3); map.put(k4, v4); map.put(k5, v5); map.put(k6, v6); return map; } public static <K, V> Map<K, V> mp(K k0, V v0, K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7) { HashMap<K, V> map = new HashMap<K, V>(10); map.put(k0, v0); map.put(k1, v1); map.put(k2, v2); map.put(k3, v3); map.put(k4, v4); map.put(k5, v5); map.put(k6, v6); map.put(k7, v7); return map; } public static <K, V> Map<K, V> mp(K k0, V v0, K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8) { HashMap<K, V> map = new HashMap<K, V>(10); map.put(k0, v0); map.put(k1, v1); map.put(k2, v2); map.put(k3, v3); map.put(k4, v4); map.put(k5, v5); map.put(k6, v6); map.put(k7, v7); map.put(k8, v8); return map; } public static <K, V> Map<K, V> mp(K k0, V v0, K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9) { HashMap<K, V> map = new HashMap<K, V>(10); map.put(k0, v0); map.put(k1, v1); map.put(k2, v2); map.put(k3, v3); map.put(k4, v4); map.put(k5, v5); map.put(k6, v6); map.put(k7, v7); map.put(k8, v8); map.put(k9, v9); return map; } public static <K, V> Map<K, V> mp(K k0, V v0, K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, Entry<K,V>...entries) { HashMap<K, V> map = new HashMap<K, V>(10 + entries.length); map.put(k0, v0); map.put(k1, v1); map.put(k2, v2); map.put(k3, v3); map.put(k4, v4); map.put(k5, v5); map.put(k6, v6); map.put(k7, v7); map.put(k8, v8); map.put(k9, v9); for (Entry<K,V> entry: entries) { map.put(entry.key(), entry.value()); } return map; } public static <K, V> Map<K, V> dict(Entry<K,V>...entries) { HashMap<K, V> map = new HashMap<K, V>(5); for (Entry<K,V> entry: entries) { map.put(entry.key(), entry.value()); } return map; } // // Functional // // // Functional // public static interface Function <T> { T execute(Object... params); } private static class FunctionImpl<T> implements Function<T> { Method method; Object that; FunctionImpl(Class<T> clazz, Method method, Object that) { this.method=method; this.that = that; } @SuppressWarnings("unchecked") public T execute(Object... params) { try { return (T) method.invoke(that, params); } catch (Exception ex) { } return null; } } public static <T> Function<T> f(Class<T> returnType, Object that, Object... args) { try { return fn(returnType, that, "f", args); } catch (Exception e) { throw new ReflectionException(e); } } public static Function<?> f(Object that, Object... args) { try { return fn(that, "f", args); } catch (Exception e) { throw new ReflectionException(e); } } public static Function<?> fn(Object that, Object name, Object... args) { return fn(Object.class, that, name, args); } public static <T> Function<T> fn(Class<T> returnType, Object that, Object name, Object... args) { try { Method[] methods = clazz(that).getDeclaredMethods(); for (Method m : methods) { if (args.length <= m.getParameterTypes().length) { if (m.getName().equals(name.toString())) { m.setAccessible(true); if (Modifier.isStatic(m.getModifiers())) { return new FunctionImpl<T>(returnType, m, null); } else { return new FunctionImpl<T>(returnType, m, that); } } } } } catch (Exception ex) { log.log(Level.SEVERE, String.format("Unable to find function that=%s, name=%s, args=%s", that, name, list(args)), ex); } die("Unable to find function that=%s, name=%s, args=%s", that, name, list(args)); return null; } public static void enumerate(Function<?> f, Collection<?> c) { int index = 0; for (Object o : c) { f.execute(index, o); index++; } } public static Collection<?> filter(Function<?> f, List<?> l) { return gfilter(f,l); } public static Collection<?> filter(Function<?> f, Collection<?> c) { return gfilter(f, c); } public static <T> Collection<T> gfilter(Function<?> f, List<T> l) { ListIterator<?> listIterator = l.listIterator(); while (listIterator.hasNext()) { Boolean b = (Boolean) f.execute(listIterator.next()); if (!b) { listIterator.remove(); } } return l; } public static <T> Collection<T> gfilter(Function<?> f, Collection<T> c) { ArrayList<Object> removeList = new ArrayList<Object>(c.size()); for (Object o : c) { Boolean b = (Boolean) f.execute(0); if (!b) { removeList.add(o); } } for (Object o: removeList) { c.remove(o); } return c; } @SuppressWarnings({ "rawtypes", "unchecked" }) public static List<?> map(Function f, Collection<?> c) { return gmap(f, c); } public static <IN, OUT> List<OUT> gmap(Function<OUT> f, Collection<IN> c) { ArrayList<OUT> mapList = new ArrayList<OUT>(c.size()); for (Object o : c) { mapList.add(f.execute(o)); } return mapList; } @SuppressWarnings("rawtypes") public static Object reduce(Function f, Collection<?> c) { return greduce(f, c); } @SuppressWarnings("unchecked") public static <T> T greduce(Function<?> f, Collection<T> c) { T accumulo = null; int index=0; for (T o : c) { if (index==0) { accumulo = o; } else { accumulo = (T) f.execute(accumulo, o); } index++; } return accumulo; } }
No comments:
Post a Comment