// Path: lang/src/main/java/mumbler/truffle/type/MumblerFunction.java
// public class MumblerFunction {
//     public final RootCallTarget callTarget;
//     private MaterializedFrame lexicalScope;
// 
//     public MumblerFunction(RootCallTarget callTarget) {
//         this.callTarget = callTarget;
//     }
// 
//     public MaterializedFrame getLexicalScope() {
//         return lexicalScope;
//     }
// 
//     public void setLexicalScope(MaterializedFrame lexicalScope) {
//         this.lexicalScope = lexicalScope;
//     }
// 
//     public static MumblerFunction create(MumblerLanguage lang, FrameSlot[] arguments,
//                                          MumblerNode[] bodyNodes, FrameDescriptor frameDescriptor) {
//         return new MumblerFunction(
//                 Truffle.getRuntime().createCallTarget(
//                         MumblerRootNode.create(lang, arguments, bodyNodes, frameDescriptor)));
//     }
// }
// 
// Path: lang/src/main/java/mumbler/truffle/type/MumblerList.java
// public class MumblerList<T extends Object> implements Iterable<T> {
//     public static final MumblerList<?> EMPTY = new MumblerList<>();
// 
//     private final T car;
//     private final MumblerList<T> cdr;
//     private final int length;
// 
//     private MumblerList() {
//         this.car = null;
//         this.cdr = null;
//         this.length = 0;
//     }
// 
//     private MumblerList(T car, MumblerList<T> cdr) {
//         this.car = car;
//         this.cdr = cdr;
//         this.length = cdr.length + 1;
//     }
// 
//     @SafeVarargs
//     public static <T> MumblerList<T> list(T... objs) {
//         return list(asList(objs));
//     }
// 
//     public static <T> MumblerList<T> list(List<T> objs) {
//         @SuppressWarnings("unchecked")
//         MumblerList<T> l = (MumblerList<T>) EMPTY;
//         for (int i=objs.size()-1; i>=0; i--) {
//             l = l.cons(objs.get(i));
//         }
//         return l;
//     }
// 
//     public MumblerList<T> cons(T node) {
//         return new MumblerList<T>(node, this);
//     }
// 
//     public T car() {
//         if (this != EMPTY) {
//             return this.car;
//         }
//         throw new MumblerException("Cannot car the empty list");
//     }
// 
//     public MumblerList<T> cdr() {
//         if (this != EMPTY) {
//             return this.cdr;
//         }
//         throw new MumblerException("Cannot cdr the empty list");
//     }
// 
//     public long size() {
//         return this.length;
//     }
// 
//     @Override
//     public Iterator<T> iterator() {
//         return new Iterator<T>() {
//             private MumblerList<T> l = MumblerList.this;
// 
//             @Override
//             public boolean hasNext() {
//                 return this.l != EMPTY;
//             }
// 
//             @Override
//             public T next() {
//                 if (this.l == EMPTY) {
//                     throw new MumblerException("At end of list");
//                 }
//                 T car = this.l.car;
//                 this.l = this.l.cdr;
//                 return car;
//             }
// 
//             @Override
//             public void remove() {
//                 throw new MumblerException("Iterator is immutable");
//             }
//         };
//     }
// 
//     @Override
//     public boolean equals(Object other) {
//         if (!(other instanceof MumblerList)) {
//             return false;
//         }
//         if (this == EMPTY && other == EMPTY) {
//             return true;
//         }
// 
//         MumblerList<?> that = (MumblerList<?>) other;
//         if (this.cdr == EMPTY && that.cdr != EMPTY) {
//             return false;
//         }
//         return this.car.equals(that.car) && this.cdr.equals(that.cdr);
//     }
// 
//     @Override
//     public String toString() {
//         if (this == EMPTY) {
//             return "()";
//         }
// 
//         StringBuilder b = new StringBuilder("(" + this.car);
//         MumblerList<T> rest = this.cdr;
//         while (rest != null && rest != EMPTY) {
//             b.append(" ");
//             b.append(rest.car);
//             rest = rest.cdr;
//         }
//         b.append(")");
//         return b.toString();
//     }
// }
// 
// Path: lang/src/main/java/mumbler/truffle/type/MumblerSymbol.java
// public class MumblerSymbol {
//     public final String name;
// 
//     public MumblerSymbol(String name) {
//         this.name = name;
//     }
// 
//     @Override
//     public String toString() {
//         return this.name;
//     }
// }


import java.math.BigInteger;
import mumbler.truffle.type.MumblerFunction;
import mumbler.truffle.type.MumblerList;
import mumbler.truffle.type.MumblerSymbol;
import com.oracle.truffle.api.dsl.ImplicitCast;
import com.oracle.truffle.api.dsl.TypeSystem;
package mumbler.truffle;




@TypeSystem({long.class, boolean.class, BigInteger.class, MumblerFunction.class,
    MumblerSymbol.class, MumblerList.class, String.class})
public class MumblerTypes {
    @ImplicitCast
// Path: lang/src/main/java/mumbler/truffle/type/MumblerFunction.java
// public class MumblerFunction {
//     public final RootCallTarget callTarget;
//     private MaterializedFrame lexicalScope;
// 
//     public MumblerFunction(RootCallTarget callTarget) {
//         this.callTarget = callTarget;
//     }
// 
//     public MaterializedFrame getLexicalScope() {
//         return lexicalScope;
//     }
// 
//     public void setLexicalScope(MaterializedFrame lexicalScope) {
//         this.lexicalScope = lexicalScope;
//     }
// 
//     public static MumblerFunction create(MumblerLanguage lang, FrameSlot[] arguments,
//                                          MumblerNode[] bodyNodes, FrameDescriptor frameDescriptor) {
//         return new MumblerFunction(
//                 Truffle.getRuntime().createCallTarget(
//                         MumblerRootNode.create(lang, arguments, bodyNodes, frameDescriptor)));
//     }
// }
// 
// Path: lang/src/main/java/mumbler/truffle/type/MumblerList.java
// public class MumblerList<T extends Object> implements Iterable<T> {
//     public static final MumblerList<?> EMPTY = new MumblerList<>();
// 
//     private final T car;
//     private final MumblerList<T> cdr;
//     private final int length;
// 
//     private MumblerList() {
//         this.car = null;
//         this.cdr = null;
//         this.length = 0;
//     }
// 
//     private MumblerList(T car, MumblerList<T> cdr) {
//         this.car = car;
//         this.cdr = cdr;
//         this.length = cdr.length + 1;
//     }
// 
//     @SafeVarargs
//     public static <T> MumblerList<T> list(T... objs) {
//         return list(asList(objs));
//     }
// 
//     public static <T> MumblerList<T> list(List<T> objs) {
//         @SuppressWarnings("unchecked")
//         MumblerList<T> l = (MumblerList<T>) EMPTY;
//         for (int i=objs.size()-1; i>=0; i--) {
//             l = l.cons(objs.get(i));
//         }
//         return l;
//     }
// 
//     public MumblerList<T> cons(T node) {
//         return new MumblerList<T>(node, this);
//     }
// 
//     public T car() {
//         if (this != EMPTY) {
//             return this.car;
//         }
//         throw new MumblerException("Cannot car the empty list");
//     }
// 
//     public MumblerList<T> cdr() {
//         if (this != EMPTY) {
//             return this.cdr;
//         }
//         throw new MumblerException("Cannot cdr the empty list");
//     }
// 
//     public long size() {
//         return this.length;
//     }
// 
//     @Override
//     public Iterator<T> iterator() {
//         return new Iterator<T>() {
//             private MumblerList<T> l = MumblerList.this;
// 
//             @Override
//             public boolean hasNext() {
//                 return this.l != EMPTY;
//             }
// 
//             @Override
//             public T next() {
//                 if (this.l == EMPTY) {
//                     throw new MumblerException("At end of list");
//                 }
//                 T car = this.l.car;
//                 this.l = this.l.cdr;
//                 return car;
//             }
// 
//             @Override
//             public void remove() {
//                 throw new MumblerException("Iterator is immutable");
//             }
//         };
//     }
// 
//     @Override
//     public boolean equals(Object other) {
//         if (!(other instanceof MumblerList)) {
//             return false;
//         }
//         if (this == EMPTY && other == EMPTY) {
//             return true;
//         }
// 
//         MumblerList<?> that = (MumblerList<?>) other;
//         if (this.cdr == EMPTY && that.cdr != EMPTY) {
//             return false;
//         }
//         return this.car.equals(that.car) && this.cdr.equals(that.cdr);
//     }
// 
//     @Override
//     public String toString() {
//         if (this == EMPTY) {
//             return "()";
//         }
// 
//         StringBuilder b = new StringBuilder("(" + this.car);
//         MumblerList<T> rest = this.cdr;
//         while (rest != null && rest != EMPTY) {
//             b.append(" ");
//             b.append(rest.car);
//             rest = rest.cdr;
//         }
//         b.append(")");
//         return b.toString();
//     }
// }
// 
// Path: lang/src/main/java/mumbler/truffle/type/MumblerSymbol.java
// public class MumblerSymbol {
//     public final String name;
// 
//     public MumblerSymbol(String name) {
//         this.name = name;
//     }
// 
//     @Override
//     public String toString() {
//         return this.name;
//     }
// }


// Path: lang/src/main/java/mumbler/truffle/MumblerTypes.java
import java.math.BigInteger;
import mumbler.truffle.type.MumblerFunction;
import mumbler.truffle.type.MumblerList;
import mumbler.truffle.type.MumblerSymbol;
import com.oracle.truffle.api.dsl.ImplicitCast;
import com.oracle.truffle.api.dsl.TypeSystem;

package mumbler.truffle;




@TypeSystem({long.class, boolean.class, BigInteger.class, MumblerFunction.class,
    MumblerSymbol.class, MumblerList.class, String.class})
public class MumblerTypes {
    @ImplicitCast
    public static BigInteger castBigInteger(long value) {