From 35c288b03f8ae1d4accf764c900fd8d2668da2cf Mon Sep 17 00:00:00 2001 From: gnembon Date: Mon, 8 Feb 2021 15:39:41 -0400 Subject: [PATCH] looping on nulls behaves like on empty lists. --- src/main/java/carpet/script/language/Loops.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/carpet/script/language/Loops.java b/src/main/java/carpet/script/language/Loops.java index cfd1cbbd..4908a853 100644 --- a/src/main/java/carpet/script/language/Loops.java +++ b/src/main/java/carpet/script/language/Loops.java @@ -100,6 +100,7 @@ public class Loops { expression.addLazyFunction("map", 2, (c, t, lv) -> { Value rval= lv.get(0).evalValue(c, Context.NONE); + if (rval.isNull()) return ListValue.lazyEmpty(); if (!(rval instanceof AbstractListValue)) throw new InternalExpressionException("First argument of 'map' function should be a list or iterator"); Iterator iterator = ((AbstractListValue) rval).iterator(); @@ -145,6 +146,7 @@ public class Loops { expression.addLazyFunction("filter", 2, (c, t, lv) -> { Value rval= lv.get(0).evalValue(c, Context.NONE); + if (rval.isNull()) return ListValue.lazyEmpty(); if (!(rval instanceof AbstractListValue)) throw new InternalExpressionException("First argument of 'filter' function should be a list or iterator"); Iterator iterator = ((AbstractListValue) rval).iterator(); @@ -192,6 +194,7 @@ public class Loops { { Value rval= lv.get(0).evalValue(c, Context.NONE); + if (rval.isNull()) return LazyValue.NULL; if (!(rval instanceof AbstractListValue)) throw new InternalExpressionException("First argument of 'first' function should be a list or iterator"); Iterator iterator = ((AbstractListValue) rval).iterator(); @@ -243,6 +246,7 @@ public class Loops { expression.addLazyFunction("all", 2, (c, t, lv) -> { Value rval= lv.get(0).evalValue(c, Context.NONE); + if (rval.isNull()) return LazyValue.TRUE; if (!(rval instanceof AbstractListValue)) throw new InternalExpressionException("First argument of 'all' function should be a list or iterator"); Iterator iterator = ((AbstractListValue) rval).iterator(); @@ -307,6 +311,7 @@ public class Loops { expression.addLazyFunction("for", 2, (c, t, lv) -> { Value rval= lv.get(0).evalValue(c, Context.NONE); + if (rval.isNull()) return LazyValue.ZERO; if (!(rval instanceof AbstractListValue)) throw new InternalExpressionException("First argument of 'for' function should be a list or iterator"); Iterator iterator = ((AbstractListValue) rval).iterator(); @@ -356,12 +361,13 @@ public class Loops { // returned value is substituted to the accumulator expression.addLazyFunction("reduce", 3, (c, t, lv) -> { - LazyValue expr = lv.get(1); - Value acc = lv.get(2).evalValue(c, Context.NONE); Value rval= lv.get(0).evalValue(c, Context.NONE); + if (rval.isNull()) return ListValue.lazyEmpty(); if (!(rval instanceof AbstractListValue)) throw new InternalExpressionException("First argument of 'reduce' should be a list or iterator"); + LazyValue expr = lv.get(1); + Value acc = lv.get(2).evalValue(c, Context.NONE); Iterator iterator = ((AbstractListValue) rval).iterator(); if (!iterator.hasNext())