This repository has been archived on 2026-04-20. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
AsaJS/src/compilers/bindings/Function.ts
2026-01-30 19:42:42 +07:00

94 lines
2 KiB
TypeScript

import { RandomBindingString } from "../../components/Utils.js"
import { Parser } from "./Parser.js"
import { Expression, GenBinding } from "./types.js"
type Callback = (...args: Expression[]) => {
genBindings?: GenBinding[]
value: Expression
}
export const FunctionMap = new Map<string, Callback>()
function callFn(name: string, ...args: Expression[]) {
return FunctionMap.get(name)!(...args)
}
// Default Functions
FunctionMap.set("abs", number => {
const randomBinding = RandomBindingString(16)
return {
genBindings: [{ source: `((-1 + (${number} > 0) * 2) * ${number})`, target: randomBinding }],
value: randomBinding,
}
})
FunctionMap.set("new", expression => {
const randomBinding = RandomBindingString(16)
return {
genBindings: [{ source: expression, target: randomBinding }],
value: randomBinding,
}
})
FunctionMap.set("sqrt", number => {
const rtn = RandomBindingString(16),
$1 = RandomBindingString(16),
$2 = RandomBindingString(16)
const { genBindings: absValue, value: absRtn } = callFn("abs", number)
return {
genBindings: [
{
source: `${number} * 100 / 2`,
target: $1,
},
...absValue!,
{
source: `${absRtn} > 1`,
target: $2,
},
{
source: `(${number} < 0) * -1 + (${number} > -1) * (${$2} * ((${rtn} + ${number} / ${rtn}) / 2) + (not ${$2}) * ${rtn})`,
target: rtn,
},
],
value: rtn,
}
})
FunctionMap.set("translatable", key => {
return {
value: `'%' + ${key}`,
}
})
FunctionMap.set("bin", input => {
const { ret, bindings } = Parser.intToBin(input)
bindings.push({
source: `'§z' + ${Array.from({ length: 30 }, (_, i) => `${ret}${30 - i - 1}`).join(" + ")}`,
target: ret,
})
return { genBindings: bindings, value: ret }
})
FunctionMap.set("bind", (value, bait) => {
const ret = RandomBindingString(16)
if (!bait) {
throw new Error("Bait is required")
}
return {
genBindings: [{ source: `((${bait} - ${bait}) + ${value})`, target: ret }],
value: ret,
}
})
FunctionMap.set("int", input => {
return {
value: input,
}
})