# RPN Virtual Calculator
A browser-friendly RPN calculator implemented as a single JavaScript class, with a simple API and an example HTML interface.
## Overview
The project includes:
- `rpn-calculator.js`: calculator engine
- `rpn-example.html`: browser demo
## Highlights
- Self-contained 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`
- `clear`
### Arithmetic
- `add` / `+`
- `sub` / `-`
- `mul` / `*`
- `div` / `/`
- `mod` / `%`
- `pow` / `^` / `y^x`
- `sqr`
- `neg`
- `sqrt`
- `recip` / `1/x`
- `log`
- `ln`
### 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.