1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package net.sf.zel.instr.var;
19
20
21 import java.util.List;
22 import net.sf.zel.instr.Instruction;
23 import net.sf.zel.nr.OperableDouble;
24 import net.sf.zel.nr.OperableNumber;
25 import net.sf.zel.vm.ExecutionContext;
26 import net.sf.zel.vm.ZExecutionException;
27
28 public final class WMIN extends Instruction
29 {
30
31
32
33
34 public static final Instruction instance = new WMIN();
35
36 private static final long serialVersionUID = 4483330169540260074L;
37
38 private WMIN(){};
39
40
41
42
43
44
45 public void execute(final ExecutionContext context) throws ZExecutionException
46 {
47 final MatchIterator iterator = new MatchIterator((String) context.popSyncStackVal());
48 context.stack.pop();
49 FindMin stuff = new FindMin();
50 iterator.iterate(stuff, context.memContext);
51 context.stack.push(stuff.getMin());
52 context.ip++;
53 }
54
55 private static final class FindMin implements MatchIterator.DoStuff
56 {
57
58 private transient double min = Double.POSITIVE_INFINITY;
59
60 public OperableDouble getMin()
61 {
62 return new OperableDouble(min);
63 }
64
65 public void execute(Object obj, List context)
66 {
67 if (obj instanceof OperableNumber)
68 {
69 final double val = ((OperableNumber) obj).doubleValue();
70 if (val < min)
71 {
72 min = val;
73 }
74 }
75 }
76 }
77 }