membrain-0.0.0.0: README.md
# membrain

[](https://travis-ci.org/kowainik/membrain)
[](https://hackage.haskell.org/package/membrain)
[](http://stackage.org/lts/package/membrain)
[](http://stackage.org/nightly/package/membrain)
[](LICENSE)
> "People think dreams aren't real just because they aren't made of matter, of particles.
> Dreams are real. But they are made of viewpoints, of images, of memories and puns and lost hopes."
>
> ― Neil Gaiman
This package implements type-safe memory units. It pursues the following goals:
1. Focus on correctness.
2. Low amount of boilerplate should be required to use the library.
The ideas behind this package are described in the following blog post:
* [Insane in the Membrain](https://kowainik.github.io/posts/membrain)
The library is built around the following data type:
```haskell
newtype Memory (mem :: Nat) = Memory
{ unMemory :: Natural
}
```
This data type stores every memory internally as bits. However, unit multiplier
is stored as type-level natural number. This approach allows to represent
different units and implement instances for them with low amount of boilerplate.
`membrain` implements various useful functions to work with `Memory`:
1. Smart constructors.
2. Conversion functions.
3. Pretty displaying.
4. Dependently-typed parsing.
5. Numeric functions.
6. Type-safe wrappers around functions from `base`.
## Acknowledgement
Icons made by [Kiranshastry](https://www.flaticon.com/authors/kiranshastry) from [Flaticon](https://www.flaticon.com/) is licensed by [CC 3.0 BY](http://creativecommons.org/licenses/by/3.0/).