package no.java.incogito; import fj.F; import fj.P2; import fj.Function; import fj.F2; import fj.Unit; import fj.control.parallel.Callables; import static fj.Function.compose; import fj.pre.Ord; import fj.data.TreeMap; import java.io.InputStream; import java.io.OutputStream; import java.util.Properties; import java.util.Map.Entry; import java.util.concurrent.Callable; /** * @author <a href="mailto:trygvis@java.no">Trygve Laugstøl</a> * @version $Id$ */ public class PropertiesF { public static final F<TreeMap<String, String>, Properties> propertiesFromMap = new F<TreeMap<String, String>, Properties>() { public Properties f(TreeMap<String, String> map) { Properties properties = new Properties(); for (P2<String, String> p2 : map) { properties.setProperty(p2._1(), p2._2()); } return properties; } }; public static final F<Properties, TreeMap<String, String>> mapFromProperties = new F<Properties, TreeMap<String, String>>() { public TreeMap<String, String> f(Properties properties) { TreeMap<String, String> map = TreeMap.empty(Ord.stringOrd); for (Entry<Object, Object> entry : properties.entrySet()) { map = map.set(entry.getKey().toString(), entry.getValue().toString()); } return map; } }; public static final F<InputStream, Callable<Properties>> loadProperties = new F<InputStream, Callable<Properties>>() { public Callable<Properties> f(final InputStream inputStream) { return new Callable<Properties>() { public Properties call() throws Exception { Properties properties = new Properties(); properties.load(inputStream); return properties; } }; } }; public static final F<Properties, F<OutputStream, Callable<Unit>>> storeProperties = Function.curry(new F2<Properties, OutputStream, Callable<Unit>>() { public Callable<Unit> f(final Properties properties, final OutputStream outputStream) { return new Callable<Unit>() { public Unit call() throws Exception { properties.store(outputStream, null); return Unit.unit(); } }; } }); public static final F<InputStream, Callable<TreeMap<String, String>>> loadPropertiesAsMap = compose(Callables.fmap(mapFromProperties), loadProperties); public static final F<TreeMap<String, String>, F<OutputStream, Callable<Unit>>> storePropertiesMap = compose(storeProperties, propertiesFromMap); }