View Javadoc

1   /*
2    * #%L
3    * prolobjectlink-jpi-tuprolog
4    * %%
5    * Copyright (C) 2019 Prolobjectlink Project
6    * %%
7    * This program is free software: you can redistribute it and/or modify
8    * it under the terms of the GNU Lesser General Public License as 
9    * published by the Free Software Foundation, either version 2.1 of the 
10   * License, or (at your option) any later version.
11   * 
12   * This program is distributed in the hope that it will be useful,
13   * but WITHOUT ANY WARRANTY; without even the implied warranty of
14   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   * GNU General Lesser Public License for more details.
16   * 
17   * You should have received a copy of the GNU General Lesser Public 
18   * License along with this program.  If not, see
19   * <http://www.gnu.org/licenses/lgpl-2.1.html>.
20   * #L%
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   * @author Jose Zalacain
38   * @since 1.0
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 }