mken.paste.lol / biwascheme-post.js · 1 year ago·

const onError = function(e) { throw(e); }
const biwa = new Interpreter(onError)

function evaluate(lisp) {
    return biwa.evaluate(lisp)
}

assert_boolean = make_simple_assert("boolean", function(obj){
    return typeof(obj) == 'boolean';
});

define_libfunc("goto-char", 1, 1, function(args) {
    assert_integer(args[0]);
    nativeGotoChar(args[0]);
    return nativePoint();
});

define_libfunc("point", 0, 0, function(args) {
    return nativePoint();
});

define_libfunc("buffer-size", 0, 0, function(args) {
    return nativeBufferSize();
});

define_libfunc("insert", 1, 1, function(args) {
    assert_string(args[0]);
    nativeInsert(args[0]);
    return args[0];
});

define_libfunc("load", 1, 1, function(args) {
    assert_symbol(args[0]);
    return nativeLoad(args[0].name);
});

define_libfunc("buffer-substring", 2, 2, function(args) {
    assert_integer(args[0]);
    assert_integer(args[1]);
    return nativeBufferSubstring(args[0], args[1]);
});

define_libfunc("alert", 2, 2, function(args) {
    assert_string(args[0]);
    assert_string(args[1]);
    return nativeAlert(args[0], args[1]);
});

define_libfunc("sheet-present", 1, 1, function(args) {
    assert_list(args[0]);
    return nativeSheetPresent(args[0].to_array());
});

define_libfunc("date-picker-present", 2, 2, function(args) {
    assert_date(args[0]);
    assert_boolean(args[1]);
    return nativeDatePickerPresent(args[0], args[1]);
});

define_libfunc("location-get-lat-lon-start", 0, 0, function(args) {
    return nativeLocationGetLatLon();
});

define_libfunc("native-current-item-set", 2, 2, function(args) {
    assert_string(args[0]);
    return nativeCurrentItemSet(args[0], args[1]);
});

define_libfunc("region-beginning", 0, 0, function(args) {
    return nativeRegionBeginning();
});

define_libfunc("region-end", 0, 0, function(args) {
    return nativeRegionEnd();
});

define_libfunc("region-set", 2, 2, function(args) {
    assert_integer(args[0]);
    assert_integer(args[1]);
    return nativeRegionSelect(args[0], args[1]);
});

define_libfunc("delete-region", 2, 2, function(args) {
    assert_integer(args[0]);
    assert_integer(args[1]);
    nativeDeleteRegion(args[0], args[1]);
    return true;
});

define_libfunc("open-url", 1, 1, function(args) {
    assert_string(args[0]);
    return nativeOpenUrl(args[0]);
});

define_libfunc("pasteboard", 0, 0, function(args) {
    return nativePasteboard();
})

define_libfunc("pasteboard-set!", 1, 1, function(args) {
    assert_string(args[0]);
    return nativePasteboardSet(args[0]);
})

define_libfunc("log-contents", 0, 0, function(args) {
    return nativeLogContents();
})

define_libfunc("toast", 2, 2, function(args) {
    assert_string(args[0]);
    assert_string(args[1]);
    nativeToast(args[0], args[1]);
    return true;
});

define_libfunc("autocorrect-set!", 1, 1, function(args) {
    assert_boolean(args[0]);
    return nativeTypingHelp(args[0]);
})

define_libfunc("string-search-forward", 2, 2, function(args) {
    assert_string(args[0]);
    assert_string(args[1]);
    var index = args[1].indexOf(args[0]);
    return index == -1 ? false : index;
});

define_libfunc("string-search-backward", 2, 2, function(args) {
    assert_string(args[0]);
    assert_string(args[1]);
    var index = args[1].lastIndexOf(args[0]);
    return index == -1 ? false : index;
});

define_libfunc("string-contains?", 2, 2, function(args) {
    assert_string(args[0]);
    assert_string(args[1]);
    return args[0].includes(args[1]);
});

define_libfunc("string-prefix?", 2, 2, function(args) {
    assert_string(args[0]);
    assert_string(args[1]);
    return args[0].startsWith(args[1]);
});

define_libfunc("string-suffix?", 2, 2, function(args) {
    assert_string(args[0]);
    assert_string(args[1]);
    return args[0].endsWith(args[1]);
});

define_libfunc("string-re-search-forward", 2, 2, function(args) {
    assert_string(args[0]);
    assert_string(args[1]);
    var regex = RegExp(args[0]);
    var result = regex.exec(args[1]);
    if (result == null) {
        return array_to_list([]);
    } else {
        var match = [];
        for (i = 0 ; i < result.length ; i++) {
            match.push(result[i]);
        }
        return array_to_list(match);
    }
});

define_libfunc("string-concatenate", 1, 1, function(args) {
    assert_list(args[0]);
    return args[0].to_array().join("");
});

define_libfunc("log-debug", 1, 1, function(args) {
    assert_string(args[0]);
    return nativeLogDebug(args[0]);
});

define_libfunc("load-themes", 1, 1, function(args) {
                          assert_string(args[0]);
                          return nativeLoadThemes(args[0]);
});

// (date-adjust DATE AMOUNT DATE-KEY)
// DATE-KEY is either 'years, 'months, 'days, 'hours, 'minutes, 'seconds
define_libfunc("date-adjust", 3, 3, function(args) {
    assert_date(args[0]);
    assert_integer(args[1]);
    assert_symbol(args[2]);
    const date = dayjs(args[0]);
    const amount = args[1];
    const dateKey = args[2].toString().substring(1);
    let jsdateKey;
    switch (dateKey) {
        case 'years':
            jsdateKey = 'year';
            break;
        case 'months':
            jsdateKey = 'month';
            break;
        case 'days':
            jsdateKey = 'day';
            break;
        case 'hours':
            jsdateKey = 'hour';
            break;
        case 'minutes':
            jsdateKey = 'minute';
            break;
        case 'seconds':
            jsdateKey = 'second';
            break;
        default:
            jsdateKey = null;
    }
    let result;
    if (jsdateKey) {
        result = date.add(amount, jsdateKey);
    } else {
        result = date;
    }
    return result.toDate();
});

// (date-set DATE VALUE DATE-KEY)
// DATE-KEY is either 'years, 'months, 'days, 'hours, 'minutes, 'seconds
define_libfunc("date-set", 3, 3, function(args) {
    assert_date(args[0]);
    assert_integer(args[1]);
    assert_symbol(args[2]);
    const date = dayjs(args[0]);
    const value = args[1];
    const dateKey = args[2].toString().substring(1);
    let result;
    switch (dateKey) {
        case 'year':
            result = date.year(value);
            break;
        case 'month':
            result = date.month(value - 1);
            break;
        case 'day':
            result = date.date(value);
            break;
        case 'weekday':
            result = date.day(value);
            break;
        case 'hour':
            result = date.hour(value);
            break;
        case 'minute':
            result = date.minute(value);
            break;
        case 'second':
            result = date.second(value);
            break;
        default:
            result = date;
    }
    return result.toDate();
});