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.ListAwareTools;
25 import org.millscript.millscript.expr.Ident;
26 import org.millscript.millscript.vm.Machine;
27 import org.millscript.millscript.vm.Ref;
28
29 /**
30 * This class represents a for loop list binding action. A list binding action
31 * binds successive values in a object to a reference. Any object that can be
32 * viewed as a list is valid for this binding.
33 */
34 public final class BindingListAction extends BindingInAction {
35
36 /**
37 * The Ident to bind successive list items to.
38 */
39 private Ident var;
40
41 /**
42 * The Ref to bind successive list items to.
43 */
44 Ref ref;
45
46 /**
47 * Constructs a new list binding action, with the supplied Ident and object
48 * generating action.
49 *
50 * @param a Ident to bind values to
51 * @param b Action which generates a list-viewable object to iterate
52 * over
53 */
54 public BindingListAction( final Ident a, final Action b ) {
55 super( b );
56 var = a;
57 ref = var.getRef();
58 }
59
60 /**
61 * @see org.millscript.millscript.action.ForConditionAction#getForIterator(org.millscript.millscript.vm.Machine)
62 */
63 @Override
64 ForIterator getForIterator( final Machine mc ) {
65 return new ForIterator() {
66 private final MapIterator it = ListAwareTools.mapIterator( inAct.act1( mc ) );
67 @Override
68 public void bindAction( final Machine mc2 ) {
69
70 mc2.saveRef( ref );
71
72 ref.value = it.nextValue();
73 }
74 @Override
75 public boolean hasNext() {
76 return it.hasNext();
77 }
78 };
79 }
80
81 }