basesystems
===========
This project code contains for Encoding/Decoding number basesystems in Haskell.
It's implemented in a strategy pattern style where `BaseSystem` is a type-class
which provides the `encoder` and `decoder` methods:
```haskell
class BaseSystem a where
encoder :: a -> ByteString -> String
decoder :: a -> String -> Maybe ByteString
```
Then we define data structure representations for `a` and implement each
method with the data from `a`. For instance, this is how the implementations
of base64 and base10 are distinguished.
Example
-------
```haskell
ghci> import Data.BaseSystem
ghci> import Data.BaseSystems
ghci> import Data.BaseSystem.Internal (packInteger)
ghci>
ghci> encoder base10 (packInteger 123) -- "123"
ghci> decoder base10 "123" -- Just <123 as binary in ByteString>
ghci> encoder base64 (packInteger 123) -- "ew=="
ghci> decoder base64 "ew==" -- Just <123 as binary in ByteString>
```
Coverage
--------
This project aims to eventually implement most if not all of the
[mulitbase specification's basesytems list](
https://github.com/multiformats/multibase?tab=readme-ov-file#multibase-table).
Currently, the following basesystems are supported:
- base2
- base10
- base16(upper/lower)
- base32(upper/lower) w/pad + nopad
- base32hex(lower/upper) w/pad + nopad
- base58btc
- base64 w/pad + nopad
- base64url w/pad + nopad
Unit testing
------------
Since these functions can have such a large amount of inputs/outputs + possible
edge cases, we generate test sets in bulk from scripts in the python folder to
JSON format. Code for running tests can be found at the [main ipfshs repo](
https://git.sr.ht/~z0/ipfshs).
Reporting bugs
--------------
Bugs can be reported to the ipfshs [ticket tracker](
https://todo.sr.ht/~z0/ipfshs).
License
-------
This project is free software and is provided under the BSD 3-clause licensing
agreement.
Copyright (C) 2026 Zoey McBride
<[zoeymcbride@mailbox.org](mailto:zoeymcbride@mailbox.org)>