diff --git a/.continue/rules/project.md b/.continue/rules/project.md index 3a81a37..aea3e8b 100644 --- a/.continue/rules/project.md +++ b/.continue/rules/project.md @@ -1,20 +1,44 @@ # Project rules — RPN Virtual Calculator - Build a browser-friendly RPN calculator as a JavaScript class, preferably in a single file. -- Constructor options: `maxSize` (default 2048), `base` (default 10), `angleMode` (`deg` default; also `rad` and `grad`), `enabledCommands`. -- Available constants: `pi`, `e`. -- Public API is generic only: `push`, `pop`, `clear`, `swap(index1, index2)`, `remove(index)`, `edit(index)`, `isValidIndex(index)`, `input(command)`, and `command(name, ...args)`. -- Expose `inputValue` as a string and `isEditing` as a boolean. -- Supported operations are centralized in one dictionary with `argCount`, category, and aliases. -- Categories are limited to `Stack`, `Arithmetic`, and `Trigonometry`. -- Current commands: `add`, `sub`, `mul`, `div`, `mod`, `pow`, `sqr`, `neg`, `sqrt`, `recip`, `sin`, `cos`, `tan`, `asin`, `acos`, `atan`, `log`, `ln`, `dup`, `drop`, `swap`, `clear`, `enter`. -- Aliases: `+`, `-`, `*`, `/`, `%`, `^`, `y^x`, `1/x`. -- `mod` is the percentage operator: `a b % => (a * b) / 100`. -- `sqrt`, `asin`, `acos`, `log`, and `ln` must throw clear, explicit domain errors. -- `log` uses `Math.log10`; `ln` uses `Math.log`. -- Trig functions use degrees in the demo; `sin`, `cos`, `tan` convert to radians, inverse trig returns degrees. -- `inputValue` stays a string to keep hexadecimal input possible later. -- Example HTML must group buttons by `Stack`, `Arithmetic`, and `Trigonometry`, and call `command(...)`. - Keep code names, categories, and API identifiers in English. +- Use only read-only / generic public API methods: `push`, `pop`, `clear`, `swap(index1, index2)`, `remove(index)`, `edit(index)`, `isValidIndex(index)`, `input(command)`, and `command(name, ...args)`. +- Expose `inputValue` as a string and `isEditing` as a boolean. +- Constructor options: + - `maxSize` (default `2048`) + - `base` (default `10`) + - `angleMode` (`deg` default; also `rad` and `grad`) + - `enabledCommands` +- Available constants: `pi`, `e`. +- Supported operations must be centralized in one dictionary containing at least: + - `argCount` + - `category` + - `aliases` +- Allowed categories are limited to: `Stack`, `Arithmetic`, and `Trigonometry`. + +## Supported commands + +- Current commands: + - `add`, `sub`, `mul`, `div`, `mod`, `pow`, `sqr`, `neg`, `sqrt`, `recip`, + `sin`, `cos`, `tan`, `asin`, `acos`, `atan`, `log`, `ln`, + `dup`, `drop`, `swap`, `clear`, `enter` +- Aliases: + - `+`, `-`, `*`, `/`, `%`, `^`, `y^x`, `1/x` + +## Behavior rules + +- `mod` is the percentage operator: `a b % => (a * b) / 100` +- `sqrt`, `asin`, `acos`, `log`, and `ln` must throw clear, explicit domain errors +- `log` uses `Math.log10` +- `ln` uses `Math.log` +- Trigonometric functions use degrees in the demo: + - `sin`, `cos`, `tan` convert degrees to radians + - inverse trig functions return degrees +- `inputValue` must remain a string to preserve future hexadecimal input support +- The example HTML must group buttons by `Stack`, `Arithmetic`, and `Trigonometry` +- The example HTML must call `command(...)` for actions + +## Maintenance + - Keep this file updated after each project change using the provided editing tools. diff --git a/README.md b/README.md index 67cfc97..2e2b1fc 100644 --- a/README.md +++ b/README.md @@ -1,123 +1,45 @@ # RPN Virtual Calculator -A browser-friendly RPN calculator implemented as a single JavaScript class, with a simple API and an example HTML interface. +A browser-friendly RPN calculator built around a small, generic JavaScript API. -## Overview +## Goal -The project includes: +This project defines a reusable RPN calculator engine with: +- a simple stack-based public API +- configurable numeric and UI behavior +- centralized command metadata +- a browser demo that uses the same public API as any consumer code + +## Package contents - `rpn-calculator.js`: calculator engine -- `rpn-example.html`: browser demo +- `rpn-example.html`: example browser interface -## Highlights - -- Self-contained JavaScript class -- Configurable stack size (`maxSize`, default: 2048) -- Configurable numeric base (`base`, default: 10) +## Main features +- Single JavaScript class +- Configurable stack size (`maxSize`, default: `2048`) +- Configurable numeric base (`base`, default: `10`) - Configurable angle mode (`angleMode`, default: `deg`) -- Optional command enabling via `enabledCommands` -- Generic public API centered on `push`, `pop`, `clear`, `swap`, `remove`, `edit`, `isValidIndex`, `input`, and `command` -- `inputValue` stays a string to keep hexadecimal input possible later -- `isEditing` tracks typed input mode -- Operations are centralized with `argCount`, category, and aliases -- Categories are limited to `Stack`, `Arithmetic`, and `Trigonometry` -- Clear domain errors for invalid inputs -- Degree-based trig demo in the example HTML - -## Quick start - -### In the browser - -```html - - -``` - -### With options - -```js -const calc = new RpnCalculator({ - maxSize: 1024, - base: 10, - angleMode: 'deg', - enabledCommands: ['add', 'sub', 'mul', 'div', 'enter', 'clear'], -}); -``` - -## Public API - -### Properties - -- `stack`: current stack, with the top item at index `0` -- `inputValue`: input text as a string -- `isEditing`: whether input is currently being edited - -### Generic methods - -- `push(value)` -- `pop()` -- `clear()` -- `swap(index1, index2)` -- `remove(index)` -- `edit(index)` -- `isValidIndex(index)` -- `input(command)` -- `command(name, ...args)` - -## Supported commands - -### Stack - -- `enter` -- `dup` -- `drop` -- `swap` +- Optional command filtering through `enabledCommands` +- Generic public API centered on: + - `push` + - `pop` - `clear` + - `swap(index1, index2)` + - `remove(index)` + - `edit(index)` + - `isValidIndex(index)` + - `input(command)` + - `command(name, ...args)` +- `inputValue` is kept as a string to preserve future input formats +- `isEditing` is exposed as a boolean state +- All supported commands are described in one centralized dictionary +- Supported categories are limited to: + - `Stack` + - `Arithmetic` + - `Trigonometry` -### Arithmetic +## Basic usage -- `add` / `+` -- `sub` / `-` -- `mul` / `*` -- `div` / `/` -- `mod` / `%` -- `pow` / `^` / `y^x` -- `sqr` -- `neg` -- `sqrt` -- `recip` / `1/x` -- `log` -- `ln` +### In a browser -### Trigonometry - -- `sin` -- `cos` -- `tan` -- `asin` -- `acos` -- `atan` - -## Important behavior - -- `%` behaves as the RPN percentage operator: `a b % => (a * b) / 100` -- `sqrt`, `asin`, `acos`, `log`, and `ln` throw clear errors for invalid inputs -- `log` uses `Math.log10` -- `ln` uses `Math.log` -- `sin`, `cos`, and `tan` convert degrees to radians in the default demo -- `asin`, `acos`, and `atan` return degrees in `deg` mode - -## Example HTML - -The example UI groups buttons into `Stack`, `Arithmetic`, and `Trigonometry` sections, and calls `command(...)` to execute operations. - -## License - -To be completed according to your project.