1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package io.github.prolobjectlink.prolog.tuprolog;
23
24 import static io.github.prolobjectlink.prolog.PrologTermType.LIST_TYPE;
25
26 import java.util.Iterator;
27
28 import alice.tuprolog.Struct;
29 import alice.tuprolog.Term;
30 import io.github.prolobjectlink.prolog.AbstractIterator;
31 import io.github.prolobjectlink.prolog.PrologList;
32 import io.github.prolobjectlink.prolog.PrologProvider;
33 import io.github.prolobjectlink.prolog.PrologTerm;
34
35
36
37
38
39
40 class TuPrologList extends TuPrologTerm implements PrologList {
41
42 protected TuPrologList(PrologProvider provider) {
43 super(LIST_TYPE, provider, new Struct());
44 }
45
46 protected TuPrologList(PrologProvider provider, Term[] arguments) {
47 super(LIST_TYPE, provider, new Struct(arguments));
48 }
49
50 protected TuPrologList(PrologProvider provider, PrologTerm[] arguments) {
51 super(LIST_TYPE, provider);
52 Term[] terms = new Term[arguments.length];
53 for (int i = 0; i < arguments.length; i++) {
54 terms[i] = ((TuPrologTerm) arguments[i]).value;
55 }
56 value = new Struct(terms);
57 }
58
59 protected TuPrologList(PrologProvider provider, PrologTerm head, PrologTerm tail) {
60 super(LIST_TYPE, provider);
61 Term h = ((TuPrologTerm) head).value;
62 Term t = ((TuPrologTerm) tail).value;
63 value = new Struct(h, t);
64 }
65
66 protected TuPrologList(PrologProvider provider, PrologTerm[] arguments, PrologTerm tail) {
67 super(LIST_TYPE, provider);
68 value = ((TuPrologTerm) tail).value;
69 for (int i = arguments.length - 1; i >= 0; --i) {
70 value = new Struct(((TuPrologTerm) arguments[i]).value, value);
71 }
72 }
73
74 public int size() {
75 return ((Struct) value).listSize();
76 }
77
78 public void clear() {
79 value = new Struct();
80 }
81
82 public boolean isEmpty() {
83 return ((Struct) value).isEmptyList();
84 }
85
86 public Iterator<PrologTerm> iterator() {
87 Struct list = (Struct) value;
88 return new TuPrologListIter(list);
89 }
90
91 public PrologTerm getHead() {
92 Struct list = (Struct) value;
93 return toTerm(list.listHead(), PrologTerm.class);
94 }
95
96 public PrologTerm getTail() {
97 Struct list = (Struct) value;
98 return toTerm(list.listTail(), PrologTerm.class);
99 }
100
101 public int getArity() {
102 Struct list = (Struct) value;
103 return list.getArity();
104 }
105
106 public String getFunctor() {
107 Struct list = (Struct) value;
108 return list.getName();
109 }
110
111 public PrologTerm[] getArguments() {
112 int index = 0;
113 Struct list = (Struct) value;
114 PrologTerm[] arguments = new PrologTerm[list.listSize()];
115 Iterator<? extends Term> i = list.listIterator();
116 while (i.hasNext()) {
117 Term term = i.next();
118 arguments[index++] = toTerm(term, PrologTerm.class);
119 }
120
121 return arguments;
122 }
123
124 private class TuPrologListIter extends AbstractIterator<PrologTerm> implements Iterator<PrologTerm> {
125
126 private Iterator<? extends Term> i;
127
128 private TuPrologListIter(Struct list) {
129 i = list.listIterator();
130 }
131
132 public boolean hasNext() {
133 return i.hasNext();
134 }
135
136 public PrologTerm next() {
137 return toTerm(i.next(), PrologTerm.class);
138 }
139
140 }
141
142 }