# Description

`katamari` is a collection of various data structures and reusable higher-order functions. It does not bundle any commands. It is only a collection of modules.

# Installation

`katamari` is available as an `npm` package. You can install it via the npm package `@ephox/katamari`

## Install from npm

`npm install @ephox/katamari`.


# Usage

> Note, refrain from using any modules that are not in the `api` package.

Below is a list of commonly used parts of `katamari`

# Data Structures

## Optional Data Types

- `Optional`: A representation of None or Some(x)
- `Result`: A representation of Error(str) or Value(v)

## Asynchronous Data Types

- `Future`: An abstraction over an asynchronous value
- `FutureResult`: A composition of a `Result` and a `Future`
- `LazyValue`: An asynchronous value that is only calculated once

## Mutable Data Types

- `Cell`: A mutable piece of data
- `Singleton`: A mutable piece of optional data

## Algebraic Data Types

- `Adt`: An approximate representation of an [Algebraic Data Type](https://en.wikipedia.org/wiki/Algebraic_data_type) in JavaScript. It is based on the [Church Encoding](https://en.wikipedia.org/wiki/Church_encoding) method.

# Higher-order Functions

- `Arr`: collection of functions that operate on arrays
- `Obj`: collection of functions that operate on JavaScript objects
- `Merger`: collection of functions to merge JavaScript objects

# Tests

`katamari` uses [`bedrock`](https://www.npmjs.com/package/@ephox/bedrock) to run atomic tests. The tests are chiefly written using [jsverify](https://github.com/jsverify/jsverify)

## Running Tests

`$ yarn test`

