packages feed

basesystems-1.2.0.1: README.md

basesystems [![hackage.haskell.org](
https://img.shields.io/badge/hackage%2Ehaskell%2Eorg-5C5181?logo=haskell)](
https://hackage.haskell.org/package/basesystems)[![builds.sr.ht status](
https://builds.sr.ht/~z0/basesystems/commits/main/ipfshs-ci.yml.svg)](
https://builds.sr.ht/~z0/basesystems/commits/main/ipfshs-ci.yml?)
---------------------------------------------------------------------------

This project contains code for encoding/decoding numeric basesystems in Haskell.
It's implemented for the Haskell bytestring types and provides a type-class
interface:

```haskell
class BaseSystem a where
  encoder :: a -> ShortByteString -> String
  decoder :: a -> String -> Maybe ShortByteString
```

The library creates more `BaseSystem` classes with methods on normal
`ByteString` in `Data.BaseSystem.Strict` and `LazyByteString`
in `Data.BaseSystem.Lazy`. See the [*example*](#example).

Coverage
--------

This project aims to implement the [multibase specification's basesystems list](
https://github.com/multiformats/multibase?tab=readme-ov-file#multibase-table).

Currently, the following basesystems are supported:
- `base2` for binary
- `base10` for decimal
- `base16upper` and `base16lower` for hexadecimal
- `base32upper` and `base32lower` for base32
- `base32upperNP` and `base32lowerNP` for base32, without padding
- `base32hexupper` and `base32hexlower` for hex-style base32
- `base32hexupperNP` and `base32hexlowerNP` for hex-style base32, without
padding
- `base58btc` for Bitcoin's base58
- `base64` and `base64url` for base64 variants
- `base64NP` and `base64urlNP` for base64 variants, without padding

Example
-------

For an example of using basesystems, we can do the following in GHCI:

Set `OverloadedStrings` so `Strings` can act as `Text` data and import the
needed functions. Then import the basesystem functions and `packValue` from
`XCodec.Transcoder` to convert a number value directly into bytes.

This shows how we can take the binary value of `123` and display it in various
number systems:

```haskell
λ> import Data.BaseSystem (encoder, decoder, base2, base10, base16lower, base32lower)
λ> import XCodec.Transcoder (packValue)
λ> :t encoder
encoder :: BaseSystem a => a -> ShortByteString -> Text
λ> :t decoder
decoder :: BaseSystem a => a -> Text -> Maybe ShortByteString
λ> encoder base2 $ packValue (123 :: Int)
"1111011"
λ> encoder base16lower $ packValue (123 :: Int)
"7b"
λ> encoder base32lower $ packValue (123 :: Int)
"pm======"
```

We can also use encoders and decoders to translate one numeric representation to
another:

```haskell
λ> encoder base10 <$> decoder base2 "1111011"
Just "123"
λ> encoder base10 <$> decoder base16lower "7b"
Just "123"
λ> encoder base10 <$> decoder base32lower "pm======"
Just "123"
```

Development
-----------

This project is part of [ipfshs](https://sr.ht/~z0/ipfshs); unit tests are
provided on the main page and bugs can be reported on its [ticket tracker](
https://todo.sr.ht/~z0/ipfshs). Patches and pull requests can be submitted with
[`git send-email`](https://git-send-email.io/). To build and test this project
against all of ipfshs read [this](https://sr.ht/~z0/ipfshs/#development)
section on setting up an ipfshs development environment.

This project can also be built as a standalone library with [`cabal`](
https://github.com/haskell/cabal#ways-to-get-the-cabal-install-binary).

```shell
$ git clone https://git.sr.ht/~z0/basesystems
$ cd basesystems
$ cabal build
```

Licensing
---------

The basesystems project and its modules are free software and licensed under the
BSD 3-clause license. See [`LICENSE.txt`](LICENSE.txt).

Copyright © 2026 Zoey McBride | [zoeymcbride@mailbox.org](
mailto:zoeymcbride@mailbox.org)