package scotch.lang;
import static scotch.runtime.RuntimeSupport.applicable;
import static scotch.runtime.RuntimeSupport.box;
import static scotch.runtime.RuntimeSupport.callable;
import static scotch.symbol.type.TypeDescriptors.fn;
import static scotch.symbol.type.TypeDescriptors.var;
import scotch.data.bool.Bool;
import scotch.data.string.String_;
import scotch.runtime.Applicable;
import scotch.runtime.Callable;
import scotch.runtime.RaisedException;
import scotch.symbol.Module;
import scotch.symbol.ReExportMember;
import scotch.symbol.ReExportModule;
import scotch.symbol.Value;
import scotch.symbol.ValueType;
import scotch.symbol.type.TypeDescriptor;
@SuppressWarnings("unused")
@Module(reExports = {
@ReExportModule(moduleName = "scotch.data.int", members = {
@ReExportMember(memberName = "Int"),
@ReExportMember(memberName = "intDiv"),
@ReExportMember(memberName = "intMod"),
}),
@ReExportModule(moduleName = "scotch.data.bool", members = {
@ReExportMember(memberName = "Bool"),
@ReExportMember(memberName = "&&"),
@ReExportMember(memberName = "||"),
}),
@ReExportModule(moduleName = "scotch.data.char", members = {
@ReExportMember(memberName = "Char"),
}),
@ReExportModule(moduleName = "scotch.data.string", members = {
@ReExportMember(memberName = "String"),
@ReExportMember(memberName = "++"),
}),
@ReExportModule(moduleName = "scotch.data.double", members = {
@ReExportMember(memberName = "Double"),
@ReExportMember(memberName = "toInt"),
}),
@ReExportModule(moduleName = "scotch.data.num", members = {
@ReExportMember(memberName = "Num"),
@ReExportMember(memberName = "+"),
@ReExportMember(memberName = "-"),
@ReExportMember(memberName = "*"),
@ReExportMember(memberName = "negate"),
@ReExportMember(memberName = "-prefix"),
@ReExportMember(memberName = "abs"),
@ReExportMember(memberName = "signum"),
@ReExportMember(memberName = "fromInteger"),
}),
@ReExportModule(moduleName = "scotch.data.eq", members = {
@ReExportMember(memberName = "Eq"),
@ReExportMember(memberName = "=="),
@ReExportMember(memberName = "/="),
}),
@ReExportModule(moduleName = "scotch.data.function", members = {
@ReExportMember(memberName = "$"),
@ReExportMember(memberName = "."),
@ReExportMember(memberName = "|>"),
}),
@ReExportModule(moduleName = "scotch.data.maybe", members = {
@ReExportMember(memberName = "Maybe"),
@ReExportMember(memberName = "Just"),
@ReExportMember(memberName = "Nothing"),
}),
@ReExportModule(moduleName = "scotch.data.list", members = {
@ReExportMember(memberName = ":"),
@ReExportMember(memberName = "[]"),
}),
@ReExportModule(moduleName = "scotch.control.monad", members = {
@ReExportMember(memberName = "Monad"),
@ReExportMember(memberName = ">>="),
@ReExportMember(memberName = ">>"),
@ReExportMember(memberName = "return"),
@ReExportMember(memberName = "fail"),
}),
@ReExportModule(moduleName = "scotch.data.tuple", members = {
@ReExportMember(memberName = "(,)"),
@ReExportMember(memberName = "(,,)"),
@ReExportMember(memberName = "(,,,)"),
@ReExportMember(memberName = "(,,,,)"),
@ReExportMember(memberName = "(,,,,,)"),
@ReExportMember(memberName = "(,,,,,,)"),
@ReExportMember(memberName = "(,,,,,,,)"),
@ReExportMember(memberName = "(,,,,,,,,)"),
@ReExportMember(memberName = "(,,,,,,,,,)"),
@ReExportMember(memberName = "(,,,,,,,,,,)"),
@ReExportMember(memberName = "(,,,,,,,,,,,)"),
@ReExportMember(memberName = "(,,,,,,,,,,,,)"),
}),
@ReExportModule(moduleName = "scotch.data.ord", members = {
@ReExportMember(memberName = "Ord"),
@ReExportMember(memberName = "Ordering"),
@ReExportMember(memberName = "LessThan"),
@ReExportMember(memberName = "GreaterThan"),
@ReExportMember(memberName = "EqualTo"),
@ReExportMember(memberName = "min"),
@ReExportMember(memberName = "max"),
@ReExportMember(memberName = "compare"),
@ReExportMember(memberName = ">"),
@ReExportMember(memberName = ">="),
@ReExportMember(memberName = "<"),
@ReExportMember(memberName = "<="),
}),
@ReExportModule(moduleName = "scotch.data.either", members = {
@ReExportMember(memberName = "Either"),
@ReExportMember(memberName = "Left"),
@ReExportMember(memberName = "Right"),
}),
@ReExportModule(moduleName = "scotch.data.unit", members = {
@ReExportMember(memberName = "()"),
})
})
public class ScotchModule {
@Value(memberName = "raise")
public static <A> Applicable<String, A> raise() {
return applicable(message -> callable(() -> {
throw new RaisedException(message.call());
}));
}
@ValueType(forMember = "raise")
public static TypeDescriptor raise$type() {
return fn(String_.TYPE, var("a"));
}
@Value(memberName = "otherwise")
public static Callable<Boolean> otherwise() {
return box(true);
}
@ValueType(forMember = "otherwise")
public static TypeDescriptor otherwise$type() {
return Bool.TYPE;
}
}