1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.millscript.millscript.action;
22
23 import org.millscript.commons.util.MapIterator;
24 import org.millscript.millscript.datatypes.MapAwareTools;
25 import org.millscript.millscript.expr.Ident;
26 import org.millscript.millscript.vm.Machine;
27 import org.millscript.millscript.vm.Ref;
28
29 /**
30 * @author moya
31 */
32 /**
33 * This class represents a for loop map binding action. A map binding action
34 * binds successive key-value pairs from a map to given Idents.
35 */
36 public final class BindingMapAction extends BindingInAction {
37
38 /**
39 * The Ref to bind successive keys to.
40 */
41 Ref kref;
42
43 /**
44 * The Ref to bind successive values to.
45 */
46 Ref vref;
47
48 /**
49 * Constructs a new map binding action, with the supplied key and value
50 * Idents and object generating action.
51 *
52 * @param k Ident to bind keys to
53 * @param v Ident to bind values to
54 * @param b Action which generates a map-viewable object to iterate over
55 */
56 public BindingMapAction( final Ident k, final Ident v, final Action b ) {
57 super( b );
58 kref = k.getRef();
59 vref = v.getRef();
60 }
61
62 /**
63 * @see org.millscript.millscript.action.ForConditionAction#getForIterator(org.millscript.millscript.vm.Machine)
64 */
65 @Override ForIterator getForIterator( final Machine mc ) {
66 return new ForIterator() {
67 private final MapIterator it = MapAwareTools.mapIterator( inAct.act1( mc ) );
68 @Override
69 public void bindAction( final Machine mc2 ) {
70
71 mc2.saveRef( kref );
72 mc2.saveRef( vref );
73
74 kref.value = it.nextKey();
75 vref.value = it.currentValue();
76 }
77 @Override
78 public boolean hasNext() {
79 return it.hasNext();
80 }
81 };
82 }
83
84 }