![npm (scoped)](https://img.shields.io/npm/v/@adrielus/loopover?style=for-the-badge)
![npm bundle size (scoped)](https://img.shields.io/bundlephobia/minzip/@adrielus/loopover?style=for-the-badge)
[![forthebadge](https://forthebadge.com/images/badges/powered-by-water.svg)](https://forthebadge.com)

# Loopover

## Installation

```sh
npm install @adrielus/loopover
```

(There is also an amd build at `/dist/bundle.amd.js` which uses the `Loopover` namespace)

## Usage

### Creating a game

To create a game use the `createGame` helper and pass it the `width` and the `height` of the board:

```ts
import { createGame } from '@adrielus/loopover'

// this creates a 3x3 board
const game = createGame(3, 3)
```

The `createGame` method returns a `GameState` instance.

### Getting the metadata from a state

Each `GameState` instance has a `width` and a `height` prop:

```ts
game.width // 3
game.height // 3
```

### Iterating over a state

The `GameState` has a `[Symbol.iterator]` prop, so you can iterate over it with a for of loop:

```ts
for (const piece of game) {
    // piece is just an int
}
```

You can also transform it into an array and then use a normal for loop:

```ts
const array = [...game]

for (let index = 0; index < array.length; index++) {
    const piece = array[index]
}
```

Or you can use the cells getter which will return an array:

```ts
for (let index = 0; index < game.cells.length; i++) {
    const piece = array[index]
}
```

### Applying moves:

The GameState instance has 2 methods for applying moves: `moveX` and `moveY`. Both method accept a direction (1 or -1) and a layer.

Example:

If the board is in the following position:

|     |     |     |
| --- | --- | --- |
| 1   | 2   | 3   |
| 4   | 5   | 6   |
| 7   | 8   | 9   |

and you apply:

```ts
game.moveX(-1, 1)
```

The board will look like:

|     |     |     |
| --- | --- | --- |
| 1   | 2   | 3   |
| 5   | 6   | 4   |
| 7   | 8   | 9   |

> Note: both `moveX` and `moveY` **_WON'T_** mutate the original game state, but will return the new state.

# Contributing

First, clone this repo:

```sh
git clone https://github.com/Mateiadrielrafael/loopover
cd loopover
```

Then use **_pnpm_** to install the dependencies:

```sh
pnpm install
```

You can use the `build` command to build the package (this is dont automatically by github actions):

```sh
pnpm run build
```