Groovyしたり RPしなかったり あとは時々布教活動したり15. G*的には...
•GParsの「Data Flow」な感じ。
import static groovyx.gpars.dataflow.Dataflow.task
final def x = new DataflowVariable()
final def y = new DataflowVariable()
final def z = new DataflowVariable()
task {
z << x.val + y.val
println "Result: ${z.val}"
}
task {
x << 10
}
task {
y << 5
}
13年9月25日水曜日
41. Reactorの例
// ヘルパークラス
class ObservableExtensions {
/**
* Closure converters
*/
static <T, E extends Event<T>, V> Registration<Consumer<E>>
receive(final reactor.core.Observable selfType,
final Selector key,
final Closure<V> closure) {
selfType.receive key, new ClosureEventFunction<E, V>(closure)
}
}
// オリジナルのクラス・インタフェース
public interface Observable {
<E extends Event<?>, V> Registration<Consumer<E>>
receive(Selector sel, Function<E, V> fn);
}
13年9月25日水曜日
43. RxJavaの例
// モジュール・ディスクリプタ
// org/codehaus/groovy/runtime/m12n/StandardPropertiesModuleFactory.java
public class StandardPropertiesModuleFactory extends PropertiesModuleFactory {
public final static String MODULE_FACTORY_KEY = "moduleFactory";
public ExtensionModule newModule(final Properties properties,
final ClassLoader classLoader) {
String factoryName = properties.getProperty(MODULE_FACTORY_KEY);
if (factoryName!=null) {
Class<? extends PropertiesModuleFactory> factoryClass =
(Class<? extends PropertiesModuleFactory>)
classLoader.loadClass(factoryName);
PropertiesModuleFactory delegate = factoryClass.newInstance();
return delegate.newModule(properties, classLoader);
}
return MetaInfExtensionModule.newModule(properties, classLoader);
}
}
13年9月25日水曜日
45. RxJavaの例
// rx/lang/groovy/RxGroovyExtensionModule.java
public class RxGroovyExtensionModule extends ExtensionModule {
private final static Class[] CLASS_TO_EXTEND =
new Class[] { Observable.class, BlockingObservable.class };
@Override
public List<MetaMethod> getMetaMethods() {
List<MetaMethod> methods = new ArrayList<MetaMethod>();
for (Class classToExtend : CLASS_TO_EXTEND) {
for (final Method m : classToExtend.getMethods()) {
for (Class c : m.getParameterTypes()) {
if (Function.class.isAssignableFrom(c)) {
methods.add(createMetaMethod(m));
break;
}
}
}
}
return methods;
}
13年9月25日水曜日
46. RxJavaの例// rx/lang/groovy/RxGroovyExtensionModule.java
private MetaMethod createMetaMethod(final Method m) {
return new MetaMethod() {
@Override
public Object invoke(Object object, Object[] arguments) {
Object[] newArgs = new Object[arguments.length];
for (int i = 0; i < arguments.length; i++) {
final Object o = arguments[i];
if (o instanceof Closure) {
if (Action.class.isAssignableFrom(m.getParameterTypes()[i])) {
newArgs[i] = new GroovyActionWrapper((Closure) o);
} else
if(OnSubscribeFunc.class.isAssignableFrom(m.getParameterTypes()[i])) {
newArgs[i] = new GroovyOnSubscribeFuncWrapper((Closure) o);
} else {
newArgs[i] = new GroovyFunctionWrapper((Closure) o);
}
} else {
newArgs[i] = o;
}
}
return m.invoke(object, newArgs);
}
13年9月25日水曜日