Skip to main content

Built and signed on GitHub Actions

This package works with Deno, BrowsersIt is unknown whether this package works with Cloudflare Workers, Node.js, Bun
It is unknown whether this package works with Cloudflare Workers
It is unknown whether this package works with Node.js
This package works with Deno
It is unknown whether this package works with Bun
This package works with Browsers
JSR Score
47%
Published
4 months ago (0.1.19)
Package root>src>node>operator.ts
import { InvalidTypeForCompareError } from '../error/calculation.ts' import { InvalidTypeForOperatorError } from '../error/index.ts' import { Operator, type ValueTypes } from './base.ts' import { BooleanValue, NumberValue, PrimitiveValue, StringValue, } from './primitive.ts' export class PlusOperator extends Operator { static override friendlyName = '더하기(+)' override toPrint(): string { return '+' } override call(...operands: ValueTypes[]): NumberValue | StringValue { const [left, right] = operands if (left instanceof NumberValue && right instanceof NumberValue) { return new NumberValue(left.value + right.value) } if (left instanceof StringValue && right instanceof StringValue) { return new StringValue(left.value + right.value) } if (left instanceof StringValue && right instanceof NumberValue) { return new StringValue(left.value + right.value.toString()) } if (left instanceof NumberValue && right instanceof StringValue) { return new StringValue(left.value.toString() + right.value) } throw new InvalidTypeForOperatorError({ position: this.position, resource: { operator: this, operands, }, }) } } export class MinusOperator extends Operator { static override friendlyName = '빼기(-)' override toPrint(): string { return '-' } override call(...operands: ValueTypes[]): NumberValue { const [left, right] = operands if (left instanceof NumberValue && right instanceof NumberValue) { return new NumberValue(left.value - right.value) } throw new InvalidTypeForOperatorError({ position: this.position, resource: { operator: this, operands, }, }) } } export class MultiplyOperator extends Operator { static override friendlyName = '곱하기(*)' override toPrint(): string { return '*' } override call(...operands: ValueTypes[]): NumberValue | StringValue { const [left, right] = operands if (left instanceof NumberValue && right instanceof NumberValue) { return new NumberValue(left.value * right.value) } if (left instanceof StringValue && right instanceof NumberValue) { return new StringValue(left.value.repeat(right.value)) } if (left instanceof NumberValue && right instanceof StringValue) { return new StringValue(right.value.repeat(left.value)) } throw new InvalidTypeForOperatorError({ position: this.position, resource: { operator: this, operands, }, }) } } export class DivideOperator extends Operator { static override friendlyName = '나누기(/)' override toPrint(): string { return '/' } override call(...operands: ValueTypes[]): NumberValue { const [left, right] = operands if (left instanceof NumberValue && right instanceof NumberValue) { return new NumberValue(left.value / right.value) } throw new InvalidTypeForOperatorError({ position: this.position, resource: { operator: this, operands, }, }) } } export class ModularOperator extends Operator { static override friendlyName = '나머지(%)' override toPrint(): string { return '%' } override call(...operands: ValueTypes[]): NumberValue { const [left, right] = operands if (left instanceof NumberValue && right instanceof NumberValue) { return new NumberValue(left.value % right.value) } throw new InvalidTypeForOperatorError({ position: this.position, resource: { operator: this, operands, }, }) } } export class PowerOperator extends Operator { static override friendlyName = '제곱(**)' override toPrint(): string { return '**' } override call(...operands: ValueTypes[]): NumberValue { const [left, right] = operands if (left instanceof NumberValue && right instanceof NumberValue) { return new NumberValue(left.value ** right.value) } throw new InvalidTypeForOperatorError({ position: this.position, resource: { operator: this, operands, }, }) } } export class IntegerDivideOperator extends Operator { static override friendlyName = '정수 나누기(//)' override toPrint(): string { return '//' } override call(...operands: ValueTypes[]): NumberValue { const [left, right] = operands if (left instanceof NumberValue && right instanceof NumberValue) { return new NumberValue(Math.floor(left.value / right.value)) } throw new InvalidTypeForOperatorError({ position: this.position, resource: { operator: this, operands, }, }) } } export class EqualOperator extends Operator { static override friendlyName = '같다(=)' override toPrint(): string { return '=' } override call(...operands: ValueTypes[]): BooleanValue { const [left, right] = operands if (left instanceof PrimitiveValue && right instanceof PrimitiveValue) { return new BooleanValue(left.value === right.value) } throw new Error( "Evaluation equality between non-primitive values isn't supported yet.", ) } } export class AndOperator extends Operator { static override friendlyName = '이고(그리고)' override toPrint(): string { return '이고(그리고)' } override call(...operands: ValueTypes[]): BooleanValue { const [left, right] = operands if ( !(left instanceof BooleanValue) || !(right instanceof BooleanValue) ) { throw new InvalidTypeForOperatorError({ position: this.position, resource: { operator: this, operands, }, }) } return new BooleanValue(left.value && right.value) } } export class OrOperator extends Operator { static override friendlyName = '이거나(거나)' override toPrint(): string { return '이거나(거나)' } override call(...operands: ValueTypes[]): BooleanValue { const [left, right] = operands if ( !(left instanceof BooleanValue) || !(right instanceof BooleanValue) ) { throw new InvalidTypeForOperatorError({ position: this.position, resource: { operator: this, operands, }, }) } return new BooleanValue(left.value || right.value) } } export class GreaterThanOperator extends Operator { static override friendlyName = '크다(>)' override toPrint(): string { return '>' } override call(...operands: ValueTypes[]): BooleanValue { const [left, right] = operands if (left instanceof NumberValue && right instanceof NumberValue) { return new BooleanValue(left.value > right.value) } throw new InvalidTypeForCompareError({ position: this.position, resource: { left, right, }, }) } } export class LessThanOperator extends Operator { static override friendlyName = '작다(<)' override toPrint(): string { return '<' } override call(...operands: ValueTypes[]): BooleanValue { const [left, right] = operands if (left instanceof NumberValue && right instanceof NumberValue) { return new BooleanValue(left.value < right.value) } throw new InvalidTypeForCompareError({ position: this.position, resource: { left, right, }, }) } } export class GreaterThanOrEqualOperator extends Operator { static override friendlyName = '크거나 같다(>=)' override toPrint(): string { return '>=' } override call(...operands: ValueTypes[]): BooleanValue { const [left, right] = operands if (left instanceof NumberValue && right instanceof NumberValue) { return new BooleanValue(left.value >= right.value) } throw new InvalidTypeForCompareError({ position: this.position, resource: { left, right, }, }) } } export class LessThanOrEqualOperator extends Operator { static override friendlyName = '작거나 같다(<=)' override toPrint(): string { return '<=' } override call(...operands: ValueTypes[]): BooleanValue { const [left, right] = operands if (left instanceof NumberValue && right instanceof NumberValue) { return new BooleanValue(left.value <= right.value) } throw new InvalidTypeForCompareError({ position: this.position, resource: { left, right, }, }) } }