![JAR search and dependency download from the Maven repository](/logo.png)
com.github.krukow.clj_lang.RT Maven / Gradle / Ivy
/**
* Copyright (c) Rich Hickey. All rights reserved.
* The use and distribution terms for this software are covered by the
* Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
* which can be found in the file epl-v10.html at the root of this distribution.
* By using this software in any fashion, you are agreeing to be bound by
* the terms of this license.
* You must not remove this notice, or any other, from this software.
**/
/* rich Mar 25, 2006 4:28:27 PM */
package com.github.krukow.clj_lang;
import java.io.IOException;
import java.io.ObjectStreamException;
import java.io.OutputStreamWriter;
import java.io.PushbackReader;
import java.io.Reader;
import java.io.Serializable;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.reflect.Array;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.nio.charset.Charset;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.RandomAccess;
import java.util.Set;
import java.util.regex.Matcher;
public class RT {
static final public Boolean T = Boolean.TRUE;// Keyword.intern(Symbol.create(null, "t"));
static final public Boolean F = Boolean.FALSE;// Keyword.intern(Symbol.create(null, "t"));
// single instance of UTF-8 Charset, so as to avoid catching
// UnsupportedCharsetExceptions everywhere
static public Charset UTF8 = Charset.forName("UTF-8");
static volatile boolean readably = true;
static volatile boolean print_meta = true;
static public final Object[] EMPTY_ARRAY = new Object[] {};
static public final Comparator DEFAULT_COMPARATOR = new DefaultComparator();
private static final class DefaultComparator implements Comparator, Serializable {
public int compare(Object o1, Object o2) {
return Util.compare(o1, o2);
}
private Object readResolve() throws ObjectStreamException {
// ensures that we aren't hanging onto a new default comparator for every
// sorted set, etc., we deserialize
return DEFAULT_COMPARATOR;
}
}
// //////////// Collections support /////////////////////////////////
static public ISeq seq(Object coll) {
if (coll instanceof ASeq)
return (ASeq) coll;
else if (coll instanceof LazySeq)
return ((LazySeq) coll).seq();
else
return seqFrom(coll);
}
static ISeq seqFrom(Object coll) {
if (coll instanceof Seqable)
return ((Seqable) coll).seq();
else if (coll == null)
return null;
else if (coll instanceof Iterable)
return IteratorSeq.create(((Iterable) coll).iterator());
else if (coll.getClass().isArray())
return ArraySeq.createFromObject(coll);
else if (coll instanceof Map)
return seq(((Map) coll).entrySet());
else {
Class c = coll.getClass();
Class sc = c.getSuperclass();
throw new IllegalArgumentException("Don't know how to create ISeq from: " + c.getName());
}
}
static public Object seqOrElse(Object o) {
return seq(o) == null ? null : o;
}
static public ISeq keys(Object coll) {
return APersistentMap.KeySeq.create(seq(coll));
}
static public ISeq vals(Object coll) {
return APersistentMap.ValSeq.create(seq(coll));
}
static public IPersistentMap meta(Object x) {
if (x instanceof IMeta)
return ((IMeta) x).meta();
return null;
}
public static int count(Object o) {
if (o instanceof Counted)
return ((Counted) o).count();
return countFrom(Util.ret1(o, o = null));
}
static int countFrom(Object o) {
if (o == null)
return 0;
else if (o instanceof IPersistentCollection) {
ISeq s = seq(o);
o = null;
int i = 0;
for (; s != null; s = s.next()) {
if (s instanceof Counted)
return i + s.count();
i++;
}
return i;
} else if (o instanceof CharSequence)
return ((CharSequence) o).length();
else if (o instanceof Collection)
return ((Collection) o).size();
else if (o instanceof Map)
return ((Map) o).size();
else if (o.getClass().isArray())
return Array.getLength(o);
throw new UnsupportedOperationException("count not supported on this type: " + o.getClass().getSimpleName());
}
static public IPersistentCollection conj(IPersistentCollection coll,
Object x) {
if (coll == null)
return new PersistentList(x);
return coll.cons(x);
}
static public ISeq cons(Object x, Object coll) {
// ISeq y = seq(coll);
if (coll == null)
return new PersistentList(x);
else if (coll instanceof ISeq)
return new Cons(x, (ISeq) coll);
else
return new Cons(x, seq(coll));
}
static public Object first(Object x) {
if (x instanceof ISeq)
return ((ISeq) x).first();
ISeq seq = seq(x);
if (seq == null)
return null;
return seq.first();
}
static public Object second(Object x) {
return first(next(x));
}
static public Object third(Object x) {
return first(next(next(x)));
}
static public Object fourth(Object x) {
return first(next(next(next(x))));
}
static public ISeq next(Object x) {
if (x instanceof ISeq)
return ((ISeq) x).next();
ISeq seq = seq(x);
if (seq == null)
return null;
return seq.next();
}
static public ISeq more(Object x) {
if (x instanceof ISeq)
return ((ISeq) x).more();
ISeq seq = seq(x);
if (seq == null)
return PersistentList.EMPTY;
return seq.more();
}
//static public Seqable more(Object x){
// Seqable ret = null;
// if(x instanceof ISeq)
// ret = ((ISeq) x).more();
// else
// {
// ISeq seq = seq(x);
// if(seq == null)
// ret = PersistentList.EMPTY;
// else
// ret = seq.more();
// }
// if(ret == null)
// ret = PersistentList.EMPTY;
// return ret;
//}
static public Object peek(Object x) {
if (x == null)
return null;
return ((IPersistentStack) x).peek();
}
static public Object pop(Object x) {
if (x == null)
return null;
return ((IPersistentStack) x).pop();
}
static public Object get(Object coll, Object key) {
if (coll instanceof ILookup)
return ((ILookup) coll).valAt(key);
return getFrom(coll, key);
}
static Object getFrom(Object coll, Object key) {
if (coll == null)
return null;
else if (coll instanceof Map) {
Map m = (Map) coll;
return m.get(key);
} else if (coll instanceof IPersistentSet) {
IPersistentSet set = (IPersistentSet) coll;
return set.get(key);
} else if (key instanceof Number && (coll instanceof String || coll.getClass().isArray())) {
int n = ((Number) key).intValue();
if (n >= 0 && n < count(coll))
return nth(coll, n);
return null;
}
return null;
}
static public Object get(Object coll, Object key, Object notFound) {
if (coll instanceof ILookup)
return ((ILookup) coll).valAt(key, notFound);
return getFrom(coll, key, notFound);
}
static Object getFrom(Object coll, Object key, Object notFound) {
if (coll == null)
return notFound;
else if (coll instanceof Map) {
Map m = (Map) coll;
if (m.containsKey(key))
return m.get(key);
return notFound;
} else if (coll instanceof IPersistentSet) {
IPersistentSet set = (IPersistentSet) coll;
if (set.contains(key))
return set.get(key);
return notFound;
} else if (key instanceof Number
&& (coll instanceof String || coll.getClass().isArray())) {
int n = ((Number) key).intValue();
return n >= 0 && n < count(coll) ? nth(coll, n) : notFound;
}
return notFound;
}
static public Associative assoc(Object coll, Object key, Object val) {
if (coll == null)
return new PersistentArrayMap(new Object[] { key, val });
return ((Associative) coll).assoc(key, val);
}
static public Object contains(Object coll, Object key) {
if (coll == null)
return F;
else if (coll instanceof Associative)
return ((Associative) coll).containsKey(key) ? T : F;
else if (coll instanceof IPersistentSet)
return ((IPersistentSet) coll).contains(key) ? T : F;
else if (coll instanceof Map) {
Map m = (Map) coll;
return m.containsKey(key) ? T : F;
}
else if(coll instanceof Set) {
Set s = (Set) coll;
return s.contains(key) ? T : F;
}
else if (key instanceof Number && (coll instanceof String || coll.getClass().isArray())) {
int n = ((Number) key).intValue();
return n >= 0 && n < count(coll);
}
throw new IllegalArgumentException("contains? not supported on type: " + coll.getClass().getName());
}
static public Object find(Object coll, Object key) {
if (coll == null)
return null;
else if (coll instanceof Associative)
return ((Associative) coll).entryAt(key);
else {
Map m = (Map) coll;
if (m.containsKey(key))
return new MapEntry(key, m.get(key));
return null;
}
}
static public Object dissoc(Object coll, Object key) throws Exception {
if (coll == null)
return null;
return ((IPersistentMap) coll).without(key);
}
static public Object nth(Object coll, int n) {
if (coll instanceof Indexed)
return ((Indexed) coll).nth(n);
return nthFrom(Util.ret1(coll, coll = null), n);
}
static Object nthFrom(Object coll, int n) {
if (coll == null)
return null;
else if (coll instanceof CharSequence)
return Character.valueOf(((CharSequence) coll).charAt(n));
else if (coll.getClass().isArray())
return Reflector.prepRet(coll.getClass().getComponentType(),Array.get(coll, n));
else if (coll instanceof RandomAccess)
return ((List) coll).get(n);
else if (coll instanceof Matcher)
return ((Matcher) coll).group(n);
else if (coll instanceof Map.Entry) {
Map.Entry e = (Map.Entry) coll;
if (n == 0)
return e.getKey();
else if (n == 1)
return e.getValue();
throw new IndexOutOfBoundsException();
}
else if (coll instanceof Sequential) {
ISeq seq = RT.seq(coll);
coll = null;
for (int i = 0; i <= n && seq != null; ++i, seq = seq.next()) {
if (i == n)
return seq.first();
}
throw new IndexOutOfBoundsException();
} else
throw new UnsupportedOperationException("nth not supported on this type: " + coll.getClass().getSimpleName());
}
static public Object nth(Object coll, int n, Object notFound) {
if (coll instanceof Indexed) {
Indexed v = (Indexed) coll;
return v.nth(n, notFound);
}
return nthFrom(coll, n, notFound);
}
static Object nthFrom(Object coll, int n, Object notFound) {
if (coll == null)
return notFound;
else if (n < 0)
return notFound;
else if (coll instanceof CharSequence) {
CharSequence s = (CharSequence) coll;
if (n < s.length())
return Character.valueOf(s.charAt(n));
return notFound;
} else if (coll.getClass().isArray()) {
if (n < Array.getLength(coll))
return Reflector.prepRet(coll.getClass().getComponentType(), Array.get(coll, n));
return notFound;
} else if (coll instanceof RandomAccess) {
List list = (List) coll;
if (n < list.size())
return list.get(n);
return notFound;
} else if (coll instanceof Matcher) {
Matcher m = (Matcher) coll;
if (n < m.groupCount())
return m.group(n);
return notFound;
} else if (coll instanceof Map.Entry) {
Map.Entry e = (Map.Entry) coll;
if (n == 0)
return e.getKey();
else if (n == 1)
return e.getValue();
return notFound;
} else if (coll instanceof Sequential) {
ISeq seq = RT.seq(coll);
coll = null;
for (int i = 0; i <= n && seq != null; ++i, seq = seq.next()) {
if (i == n)
return seq.first();
}
return notFound;
} else
throw new UnsupportedOperationException(
"nth not supported on this type: "
+ coll.getClass().getSimpleName());
}
static public Object assocN(int n, Object val, Object coll) {
if (coll == null)
return null;
else if (coll instanceof IPersistentVector)
return ((IPersistentVector) coll).assocN(n, val);
else if (coll instanceof Object[]) {
// hmm... this is not persistent
Object[] array = ((Object[]) coll);
array[n] = val;
return array;
} else
return null;
}
/**
* ********************* Boxing/casts ******************************
*/
static public Object box(Object x) {
return x;
}
static public Character box(char x) {
return Character.valueOf(x);
}
static public Object box(boolean x) {
return x ? T : F;
}
static public Object box(Boolean x) {
return x;// ? T : null;
}
static public Number box(byte x) {
return x;// Num.from(x);
}
static public Number box(short x) {
return x;// Num.from(x);
}
static public Number box(int x) {
return x;// Num.from(x);
}
static public Number box(long x) {
return x;// Num.from(x);
}
static public Number box(float x) {
return x;// Num.from(x);
}
static public Number box(double x) {
return x;// Num.from(x);
}
static public char charCast(Object x) {
if (x instanceof Character)
return ((Character) x).charValue();
long n = ((Number) x).longValue();
if (n < Character.MIN_VALUE || n > Character.MAX_VALUE)
throw new IllegalArgumentException("Value out of range for char: "
+ x);
return (char) n;
}
static public char charCast(byte x){
char i = (char) x;
if(i != x)
throw new IllegalArgumentException("Value out of range for char: " + x);
return i;
}
static public char charCast(short x){
char i = (char) x;
if(i != x)
throw new IllegalArgumentException("Value out of range for char: " + x);
return i;
}
static public char charCast(char x){
return x;
}
static public char charCast(int x){
char i = (char) x;
if(i != x)
throw new IllegalArgumentException("Value out of range for char: " + x);
return i;
}
static public char charCast(long x){
char i = (char) x;
if(i != x)
throw new IllegalArgumentException("Value out of range for char: " + x);
return i;
}
static public char charCast(float x){
if(x >= Character.MIN_VALUE && x <= Character.MAX_VALUE)
return (char) x;
throw new IllegalArgumentException("Value out of range for char: " + x);
}
static public char charCast(double x){
if(x >= Character.MIN_VALUE && x <= Character.MAX_VALUE)
return (char) x;
throw new IllegalArgumentException("Value out of range for char: " + x);
}
static public boolean booleanCast(Object x) {
if (x instanceof Boolean)
return ((Boolean) x).booleanValue();
return x != null;
}
static public boolean booleanCast(boolean x){
return x;
}
static public byte byteCast(Object x){
if(x instanceof Byte)
return ((Byte) x).byteValue();
long n = longCast(x);
if(n < Byte.MIN_VALUE || n > Byte.MAX_VALUE)
throw new IllegalArgumentException("Value out of range for byte: " + x);
return (byte) n;
}
static public byte byteCast(byte x){
return x;
}
static public byte byteCast(short x){
byte i = (byte) x;
if(i != x)
throw new IllegalArgumentException("Value out of range for byte: " + x);
return i;
}
static public byte byteCast(int x){
byte i = (byte) x;
if(i != x)
throw new IllegalArgumentException("Value out of range for byte: " + x);
return i;
}
static public byte byteCast(long x){
byte i = (byte) x;
if(i != x)
throw new IllegalArgumentException("Value out of range for byte: " + x);
return i;
}
static public byte byteCast(float x){
if(x >= Byte.MIN_VALUE && x <= Byte.MAX_VALUE)
return (byte) x;
throw new IllegalArgumentException("Value out of range for byte: " + x);
}
static public byte byteCast(double x){
if(x >= Byte.MIN_VALUE && x <= Byte.MAX_VALUE)
return (byte) x;
throw new IllegalArgumentException("Value out of range for byte: " + x);
}
static public short shortCast(Object x){
if(x instanceof Short)
return ((Short) x).shortValue();
long n = longCast(x);
if(n < Short.MIN_VALUE || n > Short.MAX_VALUE)
throw new IllegalArgumentException("Value out of range for short: " + x);
return (short) n;
}
static public short shortCast(byte x){
return x;
}
static public short shortCast(short x){
return x;
}
static public short shortCast(int x){
short i = (short) x;
if(i != x)
throw new IllegalArgumentException("Value out of range for short: " + x);
return i;
}
static public short shortCast(long x){
short i = (short) x;
if(i != x)
throw new IllegalArgumentException("Value out of range for short: " + x);
return i;
}
static public short shortCast(float x){
if(x >= Short.MIN_VALUE && x <= Short.MAX_VALUE)
return (short) x;
throw new IllegalArgumentException("Value out of range for short: " + x);
}
static public short shortCast(double x){
if(x >= Short.MIN_VALUE && x <= Short.MAX_VALUE)
return (short) x;
throw new IllegalArgumentException("Value out of range for short: " + x);
}
static public int intCast(Object x){
if(x instanceof Integer)
return ((Integer)x).intValue();
if(x instanceof Number)
{
long n = longCast(x);
return intCast(n);
}
return ((Character) x).charValue();
}
static public int intCast(char x) {
return x;
}
static public int intCast(byte x) {
return x;
}
static public int intCast(short x) {
return x;
}
static public int intCast(int x) {
return x;
}
static public int intCast(float x) {
if (x < Integer.MIN_VALUE || x > Integer.MAX_VALUE)
throw new IllegalArgumentException("Value out of range for int: " + x);
return (int) x;
}
static public int intCast(long x) {
if (x < Integer.MIN_VALUE || x > Integer.MAX_VALUE)
throw new IllegalArgumentException("Value out of range for int: " + x);
return (int) x;
}
static public int intCast(double x) {
if (x < Integer.MIN_VALUE || x > Integer.MAX_VALUE)
throw new IllegalArgumentException("Value out of range for int: " + x);
return (int) x;
}
static public long longCast(Object x){
if(x instanceof Integer || x instanceof Long)
return ((Number) x).longValue();
else if (x instanceof BigInt)
{
BigInt bi = (BigInt) x;
if(bi.bipart == null)
return bi.lpart;
else
throw new IllegalArgumentException("Value out of range for long: " + x);
}
else if (x instanceof BigInteger)
{
BigInteger bi = (BigInteger) x;
if(bi.bitLength() < 64)
return bi.longValue();
else
throw new IllegalArgumentException("Value out of range for long: " + x);
}
else if (x instanceof Byte || x instanceof Short)
return ((Number) x).longValue();
else if (x instanceof Ratio)
return longCast(((Ratio)x).bigIntegerValue());
else if (x instanceof Character)
return longCast(((Character) x).charValue());
else
return longCast(((Number)x).doubleValue());
}
static public long longCast(byte x){
return x;
}
static public long longCast(short x){
return x;
}
static public long longCast(int x) {
return x;
}
static public long longCast(float x) {
if (x < Long.MIN_VALUE || x > Long.MAX_VALUE)
throw new IllegalArgumentException("Value out of range for long: " + x);
return (long) x;
}
static public long longCast(long x) {
return x;
}
static public long longCast(double x) {
if (x < Long.MIN_VALUE || x > Long.MAX_VALUE)
throw new IllegalArgumentException("Value out of range for long: " + x);
return (long) x;
}
static public float floatCast(Object x) {
if (x instanceof Float)
return ((Float) x).floatValue();
double n = ((Number) x).doubleValue();
if (n < -Float.MAX_VALUE || n > Float.MAX_VALUE)
throw new IllegalArgumentException("Value out of range for float: " + x);
return (float) n;
}
static public float floatCast(byte x){
return x;
}
static public float floatCast(short x){
return x;
}
static public float floatCast(int x) {
return x;
}
static public float floatCast(float x) {
return x;
}
static public float floatCast(long x) {
return x;
}
static public float floatCast(double x) {
if (x < -Float.MAX_VALUE || x > Float.MAX_VALUE)
throw new IllegalArgumentException("Value out of range for float: " + x);
return (float) x;
}
static public double doubleCast(Object x) {
return ((Number) x).doubleValue();
}
static public double doubleCast(byte x){
return x;
}
static public double doubleCast(short x){
return x;
}
static public double doubleCast(int x) {
return x;
}
static public double doubleCast(float x) {
return x;
}
static public double doubleCast(long x) {
return x;
}
static public double doubleCast(double x) {
return x;
}
static public IPersistentSet set(Object... init) {
return PersistentHashSet.createWithCheck(init);
}
static public IPersistentVector vector(Object... init) {
return LazilyPersistentVector.createOwning(init);
}
static public IPersistentVector subvec(IPersistentVector v, int start,
int end) {
if (end < start || start < 0 || end > v.count())
throw new IndexOutOfBoundsException();
if (start == end)
return PersistentVector.EMPTY;
return new APersistentVector.SubVector(null, v, start, end);
}
/**
* **************************************** list support
* *******************************
*/
static public ISeq list() {
return null;
}
static public ISeq list(Object arg1) {
return new PersistentList(arg1);
}
static public ISeq list(Object arg1, Object arg2) {
return listStar(arg1, arg2, null);
}
static public ISeq list(Object arg1, Object arg2, Object arg3) {
return listStar(arg1, arg2, arg3, null);
}
static public ISeq list(Object arg1, Object arg2, Object arg3, Object arg4) {
return listStar(arg1, arg2, arg3, arg4, null);
}
static public ISeq list(Object arg1, Object arg2, Object arg3, Object arg4,
Object arg5) {
return listStar(arg1, arg2, arg3, arg4, arg5, null);
}
static public ISeq listStar(Object arg1, ISeq rest) {
return (ISeq) cons(arg1, rest);
}
static public ISeq listStar(Object arg1, Object arg2, ISeq rest) {
return (ISeq) cons(arg1, cons(arg2, rest));
}
static public ISeq listStar(Object arg1, Object arg2, Object arg3, ISeq rest) {
return (ISeq) cons(arg1, cons(arg2, cons(arg3, rest)));
}
static public ISeq listStar(Object arg1, Object arg2, Object arg3,
Object arg4, ISeq rest) {
return (ISeq) cons(arg1, cons(arg2, cons(arg3, cons(arg4, rest))));
}
static public ISeq listStar(Object arg1, Object arg2, Object arg3,
Object arg4, Object arg5, ISeq rest) {
return (ISeq) cons(arg1, cons(arg2, cons(arg3, cons(arg4, cons(arg5,
rest)))));
}
static public ISeq arrayToList(Object[] a) {
ISeq ret = null;
for (int i = a.length - 1; i >= 0; --i)
ret = (ISeq) cons(a[i], ret);
return ret;
}
static public Object[] object_array(Object sizeOrSeq) {
if (sizeOrSeq instanceof Number)
return new Object[((Number) sizeOrSeq).intValue()];
else {
ISeq s = RT.seq(sizeOrSeq);
int size = RT.count(s);
Object[] ret = new Object[size];
for (int i = 0; i < size && s != null; i++, s = s.next())
ret[i] = s.first();
return ret;
}
}
static public Object[] toArray(Object coll) {
if (coll == null)
return EMPTY_ARRAY;
else if (coll instanceof Object[])
return (Object[]) coll;
else if (coll instanceof Collection)
return ((Collection) coll).toArray();
else if (coll instanceof Map)
return ((Map) coll).entrySet().toArray();
else if (coll instanceof String) {
char[] chars = ((String) coll).toCharArray();
Object[] ret = new Object[chars.length];
for (int i = 0; i < chars.length; i++)
ret[i] = chars[i];
return ret;
} else if (coll.getClass().isArray()) {
ISeq s = (seq(coll));
Object[] ret = new Object[count(s)];
for (int i = 0; i < ret.length; i++, s = s.next())
ret[i] = s.first();
return ret;
} else
throw Util.runtimeException("Unable to convert: " + coll.getClass() + " to Object[]");
}
static public Object[] seqToArray(ISeq seq) {
int len = length(seq);
Object[] ret = new Object[len];
for (int i = 0; seq != null; ++i, seq = seq.next())
ret[i] = seq.first();
return ret;
}
// supports java Collection.toArray(T[])
static public Object[] seqToPassedArray(ISeq seq, Object[] passed){
Object[] dest = passed;
int len = count(seq);
if (len > dest.length) {
dest = (Object[]) Array.newInstance(passed.getClass().getComponentType(), len);
}
for(int i = 0; seq != null; ++i, seq = seq.next())
dest[i] = seq.first();
if (len < passed.length) {
dest[len] = null;
}
return dest;
}
static public Object seqToTypedArray(ISeq seq) {
Class type = (seq != null) ? seq.first().getClass() : Object.class;
return seqToTypedArray(type, seq);
}
static public Object seqToTypedArray(Class type, ISeq seq) {
Object ret = Array.newInstance(type, length(seq));
if(type == Integer.TYPE){
for(int i = 0; seq != null; ++i, seq=seq.next()){
Array.set(ret, i, intCast(seq.first()));
}
} else if(type == Byte.TYPE) {
for(int i = 0; seq != null; ++i, seq=seq.next()){
Array.set(ret, i, byteCast(seq.first()));
}
} else if(type == Float.TYPE) {
for(int i = 0; seq != null; ++i, seq=seq.next()){
Array.set(ret, i, floatCast(seq.first()));
}
} else if(type == Short.TYPE) {
for(int i = 0; seq != null; ++i, seq=seq.next()){
Array.set(ret, i, shortCast(seq.first()));
}
} else if(type == Character.TYPE) {
for(int i = 0; seq != null; ++i, seq=seq.next()){
Array.set(ret, i, charCast(seq.first()));
}
} else {
for(int i = 0; seq != null; ++i, seq=seq.next()){
Array.set(ret, i, seq.first());
}
}
return ret;
}
static public int length(ISeq list) {
int i = 0;
for (ISeq c = list; c != null; c = c.next()) {
i++;
}
return i;
}
static public int boundedLength(ISeq list, int limit) {
int i = 0;
for (ISeq c = list; c != null && i <= limit; c = c.next()) {
i++;
}
return i;
}
// /////////////////////////////// reader support
// ////////////////////////////////
static Character readRet(int ret) {
if (ret == -1)
return null;
return box((char) ret);
}
static public Character readChar(Reader r) throws Exception {
int ret = r.read();
return readRet(ret);
}
static public Character peekChar(Reader r) throws Exception {
int ret;
if (r instanceof PushbackReader) {
ret = r.read();
((PushbackReader) r).unread(ret);
} else {
r.mark(1);
ret = r.read();
r.reset();
}
return readRet(ret);
}
static public boolean isReduced(Object r){
return r instanceof Reduced;
}
static public String printString(Object x) {
try {
StringWriter sw = new StringWriter();
print(x, sw);
return sw.toString();
}
catch(Exception e) {
throw Util.sneakyThrow(e);
}
}
static public void print(Object x, Writer w) throws IOException {
if (x instanceof Obj) {
Obj o = (Obj) x;
if (RT.count(o.meta()) > 0) {
IPersistentMap meta = o.meta();
w.write("#^");
print(meta, w);
w.write(' ');
}
}
if (x == null)
w.write("null");
else if (x instanceof ISeq || x instanceof IPersistentList) {
w.write('(');
printInnerSeq(seq(x), w);
w.write(')');
} else if (x instanceof String) {
String s = (String) x;
if (!readably)
w.write(s);
else {
w.write('"');
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
switch (c) {
case '\n':
w.write("\\n");
break;
case '\t':
w.write("\\t");
break;
case '\r':
w.write("\\r");
break;
case '"':
w.write("\\\"");
break;
case '\\':
w.write("\\\\");
break;
case '\f':
w.write("\\f");
break;
case '\b':
w.write("\\b");
break;
default:
w.write(c);
}
}
w.write('"');
}
} else if (x instanceof IPersistentMap) {
w.write('{');
for (ISeq s = seq(x); s != null; s = s.next()) {
IMapEntry e = (IMapEntry) s.first();
print(e.key(), w);
w.write(' ');
print(e.val(), w);
if (s.next() != null)
w.write(", ");
}
w.write('}');
} else if (x instanceof IPersistentVector) {
IPersistentVector a = (IPersistentVector) x;
w.write('[');
for (int i = 0; i < a.count(); i++) {
print(a.nth(i), w);
if (i < a.count() - 1)
w.write(' ');
}
w.write(']');
} else if (x instanceof IPersistentSet) {
w.write("#{");
for (ISeq s = seq(x); s != null; s = s.next()) {
print(s.first(), w);
if (s.next() != null)
w.write(" ");
}
w.write('}');
} else if (x instanceof Character) {
char c = ((Character) x).charValue();
if (!readably)
w.write(c);
else {
w.write('\\');
switch (c) {
case '\n':
w.write("newline");
break;
case '\t':
w.write("tab");
break;
case ' ':
w.write("space");
break;
case '\b':
w.write("backspace");
break;
case '\f':
w.write("formfeed");
break;
case '\r':
w.write("return");
break;
default:
w.write(c);
}
}
} else if (x instanceof Class) {
w.write("#=");
w.write(((Class) x).getName());
} else if (x instanceof BigDecimal && readably) {
w.write(x.toString());
w.write('M');
}
else if(x instanceof BigInt && readably) {
w.write(x.toString());
w.write('N');
} else if(x instanceof BigInteger && readably) {
w.write(x.toString());
w.write("BIGINT");
} else
w.write(x.toString());
}
// */
private static void printInnerSeq(ISeq x, Writer w) throws IOException {
for (ISeq s = x; s != null; s = s.next()) {
print(s.first(), w);
if (s.next() != null)
w.write(' ');
}
}
static public void formatAesthetic(Writer w, Object obj) throws IOException {
if (obj == null)
w.write("null");
else
w.write(obj.toString());
}
static public void formatStandard(Writer w, Object obj) throws IOException {
if (obj == null)
w.write("null");
else if (obj instanceof String) {
w.write('"');
w.write((String) obj);
w.write('"');
} else if (obj instanceof Character) {
w.write('\\');
char c = ((Character) obj).charValue();
switch (c) {
case '\n':
w.write("newline");
break;
case '\t':
w.write("tab");
break;
case ' ':
w.write("space");
break;
case '\b':
w.write("backspace");
break;
case '\f':
w.write("formfeed");
break;
default:
w.write(c);
}
} else
w.write(obj.toString());
}
static public Object format(Object o, String s, Object... args) throws IOException {
Writer w;
if (o == null)
w = new StringWriter();
else if (Util.equals(o, T))
w = (Writer) new OutputStreamWriter(System.out);
else
w = (Writer) o;
doFormat(w, s, ArraySeq.create(args));
if (o == null)
return w.toString();
return null;
}
static public ISeq doFormat(Writer w, String s, ISeq args) throws IOException {
for (int i = 0; i < s.length();) {
char c = s.charAt(i++);
switch (Character.toLowerCase(c)) {
case '~':
char d = s.charAt(i++);
switch (Character.toLowerCase(d)) {
case '%':
w.write('\n');
break;
case 't':
w.write('\t');
break;
case 'a':
if (args == null)
throw new IllegalArgumentException("Missing argument");
RT.formatAesthetic(w, RT.first(args));
args = RT.next(args);
break;
case 's':
if (args == null)
throw new IllegalArgumentException("Missing argument");
RT.formatStandard(w, RT.first(args));
args = RT.next(args);
break;
case '{':
int j = s.indexOf("~}", i); // note - does not nest
if (j == -1)
throw new IllegalArgumentException("Missing ~}");
String subs = s.substring(i, j);
for (ISeq sargs = RT.seq(RT.first(args)); sargs != null;)
sargs = doFormat(w, subs, sargs);
args = RT.next(args);
i = j + 2; // skip ~}
break;
case '^':
if (args == null)
return null;
break;
case '~':
w.write('~');
break;
default:
throw new IllegalArgumentException(
"Unsupported ~ directive: " + d);
}
break;
default:
w.write(c);
}
}
return args;
}
// /////////////////////////////// values //////////////////////////
static public Object[] setValues(Object... vals) {
// ThreadLocalData.setValues(vals);
if (vals.length > 0)
return vals;// [0];
return null;
}
static public float aget(float[] xs, int i) {
return xs[i];
}
static public float aset(float[] xs, int i, float v) {
xs[i] = v;
return v;
}
static public int alength(float[] xs) {
return xs.length;
}
static public float[] aclone(float[] xs) {
return xs.clone();
}
static public double aget(double[] xs, int i) {
return xs[i];
}
static public double aset(double[] xs, int i, double v) {
xs[i] = v;
return v;
}
static public int alength(double[] xs) {
return xs.length;
}
static public double[] aclone(double[] xs) {
return xs.clone();
}
static public int aget(int[] xs, int i) {
return xs[i];
}
static public int aset(int[] xs, int i, int v) {
xs[i] = v;
return v;
}
static public int alength(int[] xs) {
return xs.length;
}
static public int[] aclone(int[] xs) {
return xs.clone();
}
static public long aget(long[] xs, int i) {
return xs[i];
}
static public long aset(long[] xs, int i, long v) {
xs[i] = v;
return v;
}
static public int alength(long[] xs) {
return xs.length;
}
static public long[] aclone(long[] xs) {
return xs.clone();
}
static public char aget(char[] xs, int i) {
return xs[i];
}
static public char aset(char[] xs, int i, char v) {
xs[i] = v;
return v;
}
static public int alength(char[] xs) {
return xs.length;
}
static public char[] aclone(char[] xs) {
return xs.clone();
}
static public byte aget(byte[] xs, int i) {
return xs[i];
}
static public byte aset(byte[] xs, int i, byte v) {
xs[i] = v;
return v;
}
static public int alength(byte[] xs) {
return xs.length;
}
static public byte[] aclone(byte[] xs) {
return xs.clone();
}
static public short aget(short[] xs, int i) {
return xs[i];
}
static public short aset(short[] xs, int i, short v) {
xs[i] = v;
return v;
}
static public int alength(short[] xs) {
return xs.length;
}
static public short[] aclone(short[] xs) {
return xs.clone();
}
static public boolean aget(boolean[] xs, int i) {
return xs[i];
}
static public boolean aset(boolean[] xs, int i, boolean v) {
xs[i] = v;
return v;
}
static public int alength(boolean[] xs) {
return xs.length;
}
static public boolean[] aclone(boolean[] xs) {
return xs.clone();
}
static public Object aget(Object[] xs, int i) {
return xs[i];
}
static public Object aset(Object[] xs, int i, Object v) {
xs[i] = v;
return v;
}
static public int alength(Object[] xs) {
return xs.length;
}
static public Object[] aclone(Object[] xs) {
return xs.clone();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy