Skip to content

Commit b7f7655

Browse files
Treiblesschorlegselzer
authored andcommitted
Add functional type transformers for Bi types and test
1 parent e5429ca commit b7f7655

3 files changed

Lines changed: 105 additions & 0 deletions

File tree

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package org.scijava.ops.transform.functional;
2+
3+
import java.lang.reflect.Type;
4+
import java.util.function.BiFunction;
5+
6+
import org.scijava.ops.OpService;
7+
import org.scijava.ops.core.BiComputer;
8+
import org.scijava.ops.matcher.OpRef;
9+
import org.scijava.ops.transform.OpTransformer;
10+
import org.scijava.ops.transform.TypeModUtils;
11+
import org.scijava.ops.util.Adapt;
12+
import org.scijava.ops.util.Functions;
13+
import org.scijava.plugin.Plugin;
14+
import org.scijava.types.Nil;
15+
16+
@Plugin(type = OpTransformer.class)
17+
public class BiComputerToBiFunctionTransformer implements FunctionalTypeTransformer {
18+
19+
@Override
20+
public Object transform(OpService opService, OpRef ref, Object src) throws Exception {
21+
Type[] outTypes = ref.getOutTypes();
22+
Type[] argTypes = ref.getArgs();
23+
BiFunction srcOp = Functions.binary(opService, "create", Nil.of(argTypes[0]), Nil.of(argTypes[1]),
24+
Nil.of(outTypes[0]));
25+
return Adapt.Computers.asBiFunction((BiComputer) src, srcOp);
26+
}
27+
28+
@Override
29+
public Class<?> srcClass() {
30+
return BiComputer.class;
31+
}
32+
33+
@Override
34+
public Class<?> targetClass() {
35+
return BiFunction.class;
36+
}
37+
38+
@Override
39+
public Type[] getTransformedArgTypes(OpRef toRef) {
40+
return TypeModUtils.insert(toRef.getArgs(), toRef.getOutTypes()[0], 2);
41+
}
42+
43+
@Override
44+
public Type[] getTransformedOutputTypes(OpRef toRef) {
45+
return toRef.getOutTypes();
46+
}
47+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package org.scijava.ops.transform.functional;
2+
3+
import java.lang.reflect.Type;
4+
import java.util.function.BiFunction;
5+
6+
import org.scijava.ops.OpService;
7+
import org.scijava.ops.core.BiComputer;
8+
import org.scijava.ops.core.Computer;
9+
import org.scijava.ops.matcher.OpRef;
10+
import org.scijava.ops.transform.OpTransformer;
11+
import org.scijava.ops.transform.TypeModUtils;
12+
import org.scijava.ops.util.Adapt;
13+
import org.scijava.ops.util.Computers;
14+
import org.scijava.plugin.Plugin;
15+
import org.scijava.types.Nil;
16+
17+
@Plugin(type = OpTransformer.class)
18+
public class BiFunctionToBiComputerTransformer implements FunctionalTypeTransformer {
19+
20+
@Override
21+
public Object transform(OpService opService, OpRef ref, Object src) {
22+
Type[] outTypes = ref.getOutTypes();
23+
Computer copy = Computers.unary(opService, "copy", Nil.of(outTypes[0]), Nil.of(outTypes[0]));
24+
return Adapt.Functions.asBiComputer((BiFunction) src, copy);
25+
}
26+
27+
@Override
28+
public Class<?> srcClass() {
29+
return BiFunction.class;
30+
}
31+
32+
@Override
33+
public Class<?> targetClass() {
34+
return BiComputer.class;
35+
}
36+
37+
@Override
38+
public Type[] getTransformedArgTypes(OpRef toRef) {
39+
return TypeModUtils.remove(toRef.getArgs(), 2);
40+
}
41+
42+
@Override
43+
public Type[] getTransformedOutputTypes(OpRef toRef) {
44+
return toRef.getOutTypes();
45+
}
46+
}

src/test/java/org/scijava/ops/AutoTransformTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
package org.scijava.ops;
3131
import java.util.Arrays;
3232
import java.util.List;
33+
import java.util.function.BiFunction;
3334
import java.util.function.Function;
3435

3536
import org.junit.Test;
@@ -70,6 +71,17 @@ public void autoFunctionToComputer() {
7071
}
7172

7273
@Test
74+
public void autoBiFunctionToBiComputer() {
75+
BiFunction<double[], double[], double[]> addArrayFunction = ops().findOp( //
76+
"add", new Nil<BiFunction<double[], double[], double[]>>() {
77+
}, //
78+
new Nil[] { Nil.of(double[].class), Nil.of(double[].class) }, //
79+
Nil.of(double[].class)//
80+
);
81+
double[] res = addArrayFunction.apply(new double[]{4.0, 16.0}, new double[]{4.0, 16.0});
82+
arrayEquals(res, 8.0, 32.0);
83+
}
84+
7385
@Test
7486
public void autoLiftFuncToArray() {
7587
Function<Double[], Double[]> power3ArraysFunc = ops().findOp( //

0 commit comments

Comments
 (0)