Добавлен std::default

This commit is contained in:
Victor 2019-01-02 18:22:04 +02:00
parent a30ca2fd4d
commit 9540834d2f
3 changed files with 58 additions and 0 deletions

View File

@ -26,6 +26,7 @@ public final class std implements Module {
Functions.set("thread", new std_thread()); Functions.set("thread", new std_thread());
Functions.set("sync", new std_sync()); Functions.set("sync", new std_sync());
Functions.set("try", new std_try()); Functions.set("try", new std_try());
Functions.set("default", new std_default());
// Numbers // Numbers
Functions.set("toHexString", NumberFunctions::toHexString); Functions.set("toHexString", NumberFunctions::toHexString);

View File

@ -0,0 +1,38 @@
package com.annimon.ownlang.modules.std;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.ArrayValue;
import com.annimon.ownlang.lib.Function;
import com.annimon.ownlang.lib.MapValue;
import com.annimon.ownlang.lib.Types;
import com.annimon.ownlang.lib.Value;
public final class std_default implements Function {
@Override
public Value execute(Value... args) {
Arguments.check(2, args.length);
if (isEmpty(args[0])) {
return args[1];
}
return args[0];
}
private boolean isEmpty(Value value) {
if (value == null || value.raw() == null) {
return true;
}
switch (value.type()) {
case Types.NUMBER:
return (value.asInt() == 0);
case Types.STRING:
return (value.asString().isEmpty());
case Types.ARRAY:
return ((ArrayValue) value).size() == 0;
case Types.MAP:
return ((MapValue) value).size() == 0;
default:
return false;
}
}
}

View File

@ -0,0 +1,19 @@
use "std"
def testDefaultNumber() {
assertEquals(123, default(0, 123))
}
def testDefaultString() {
assertEquals("123", default("", "123"))
}
def testDefaultNull() {
use "java"
assertEquals("not null", default(null, "not null"))
}
def testOperatorOverloading() {
def `?:`(a, b) = default(a, b)
assertEquals("not null", "" ?: "not null")
}