aboutsummaryrefslogtreecommitdiff
path: root/neb/std
diff options
context:
space:
mode:
Diffstat (limited to 'neb/std')
-rw-r--r--neb/std/types.py28
1 files changed, 28 insertions, 0 deletions
diff --git a/neb/std/types.py b/neb/std/types.py
index 7e77597..cc40066 100644
--- a/neb/std/types.py
+++ b/neb/std/types.py
@@ -62,6 +62,32 @@ islist_multi = MultiFunction("list?")
islist_multi.register(islist_func)
TYPES.register("list?", islist_multi)
+def interpretIsNonEmptyList(symbol, args, env, ns):
+
+ # if it's not a list, we're done
+ if not (isinstance(args[0], List) or isinstance(args[0], Expr)):
+ return Bool(False)
+
+ # if it's empty, we're done
+ elif len(args[0].args) == 0:
+ return Bool(False)
+
+ # if the symbol isn't a type, we're done
+ elif not isinstance(symbol, Type):
+ return Bool(True)
+
+ inner = symbol.inner
+ if inner is None or inner.name == ":any":
+ return Bool(True)
+
+ inner_type = env.get(f"{inner.name}")
+ for arg in args[0].args:
+ valid = inner_type.validate_type(arg, env, ns)
+ if valid.value is False:
+ return Bool(False)
+ return Bool(True)
+
+
def interpretIsString(symbol, args, env, ns):
return Bool(isinstance(args[0], String))
@@ -142,6 +168,7 @@ literal_type = NebType(":literal", any_type, interpretIsLiteral)
string_type = NebType(":string", literal_type, interpretIsString)
#list_type = NebType(":list", any_type, interpretIsList)
bracket_type = NebType(":[]", any_type, interpretIsList)
+brace_type = NebType(":{}", any_type, interpretIsNonEmptyList)
bool_type = NebType(":bool", literal_type, interpretIsBool)
number_type = NebType(":number", literal_type, interpretIsNumber)
int_type = NebType(":int", number_type, interpretIsInt)
@@ -154,6 +181,7 @@ TYPES.register(":literal", literal_type)
TYPES.register(":string", string_type)
#TYPES.register(":list", list_type)
TYPES.register(":[]", bracket_type)
+TYPES.register(":{}", brace_type)
TYPES.register(":bool", bool_type)
TYPES.register(":number", number_type)
TYPES.register(":int", int_type)