from juic.datatypes import *
from juic.eval import *

def juiPrint(*args):
    print("[print]", *(juiValueString(a) for a in args))

def juiLen(x):
    if type(x) not in [str, list]:
        raise JuiTypeError("len")
    return len(x)

R_record = RecordType("record", None)
R_subrecord = RecordType("subrecord", R_record)
R_jwidget = RecordType("jwidget", None)
R_jlabel = RecordType("jlabel", R_jwidget)
R_jfkeys = RecordType("jfkeys", R_jwidget)

builtinClosure = Closure(parent=None, scope=MutableScopeData(defs={
    "print": (0, BuiltinFunction(juiPrint)),
    "len": (0, BuiltinFunction(juiLen)),

    # TODO: Remove the built-in record type "record" used for testing
    "record": (0, R_record),
    "subrecord": (0, R_subrecord),
    "jwidget": (0, R_jwidget),
    "jlabel": (0, R_jlabel),
    "jfkeys": (0, R_jfkeys),

}, timestamp=1))