diff src/goodjava/util/MapReduce.java @ 2171:8b77bd42864d

add add Thread.map_reduce
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 22 Mar 2026 19:24:52 -0600
parents
children 75c45f1a743e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/goodjava/util/MapReduce.java	Sun Mar 22 19:24:52 2026 -0600
@@ -0,0 +1,48 @@
+package goodjava.util;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.WeakHashMap;
+import java.util.Set;
+
+
+public class MapReduce {
+
+	public interface Mapper {
+		public List map(Object arg);
+	}
+
+	public interface Handler extends Mapper {
+		public List reduce(List<List> lists);
+	}
+
+	private static Map<String,MapReduce> instances = new HashMap<String,MapReduce>();
+
+	// an active handler will be arbitrarily chosen for reduce
+	public static synchronized MapReduce register(String key,Mapper mapper) {
+		MapReduce mr = instances.get(key);
+		if( mr == null ) {
+			mr = new MapReduce();
+			instances.put(key,mr);
+		}
+		mr.mappers.add(mapper);
+		return mr;
+	}
+
+	private Set<Mapper> mappers = Collections.newSetFromMap(new WeakHashMap<Mapper, Boolean>());
+
+	public List run(Object arg) {
+		List<List> lists = new ArrayList<List>();
+		Handler lastHandler = null;
+		Mapper[] snapshot = mappers.toArray(new Mapper[0]);
+		for( Mapper m : snapshot ) {
+			lists.add( m.map(arg) );
+			if( m instanceof Handler )
+				lastHandler = (Handler)m;
+		}
+		return lastHandler==null ? Collections.emptyList() : lastHandler.reduce(lists);
+	}
+}