-- | Module      : Data.BaseSystem.Alphabets
--   Description : Provides alphabets for common base-encodings
--   Copyright   : Zoey McBride (c) 2026
--   License     : BSD-3-Clause
--   Maintainer  : zoeymcbride@mailbox.org
--   Stability   : experimental
--
-- Defines common Alphabets for BaseSystems.
module Data.BaseSystem.Alphabets
  ( binary,
    decimal,
    hexlower,
    hexupper,
    btc58,
    b32lower,
    b32upper,
    b32hexlower,
    b32hexupper,
    b64,
    b64url,
  )
where

import Data.BaseSystem.Alphabet

-- | Represents base2.
binary :: Alphabet
binary :: Alphabet
binary = String -> Alphabet
mkAlphabet String
"01"

-- | Represents base10.
decimal :: Alphabet
decimal :: Alphabet
decimal = String -> Alphabet
mkAlphabet (String -> Alphabet) -> String -> Alphabet
forall a b. (a -> b) -> a -> b
$ Char
'0' Char -> String -> String
forall a. a -> [a] -> [a]
: [Char
'1' .. Char
'9']

-- | Represents base16 w/ upper case A-F.
hexupper :: Alphabet
hexupper :: Alphabet
hexupper = String -> Alphabet
mkAlphabet (String -> Alphabet) -> String -> Alphabet
forall a b. (a -> b) -> a -> b
$ [Char
'0'] String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
'1' .. Char
'9'] String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
'A' .. Char
'F']

-- | Represents base16 w/ lower case a-f.
hexlower :: Alphabet
hexlower :: Alphabet
hexlower = String -> Alphabet
mkAlphabet (String -> Alphabet) -> String -> Alphabet
forall a b. (a -> b) -> a -> b
$ [Char
'0'] String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
'1' .. Char
'9'] String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
'a' .. Char
'f']

-- | Represents Bitcoin's base58.
btc58 :: Alphabet
btc58 :: Alphabet
btc58 =
  String -> Alphabet
mkAlphabet (String -> Alphabet) -> String -> Alphabet
forall a b. (a -> b) -> a -> b
$
    [Char
'1' .. Char
'9']
      String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
'A' .. Char
'H']
      String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
'J' .. Char
'N']
      String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
'P' .. Char
'Z']
      String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
'a' .. Char
'k']
      String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
'm' .. Char
'z']

b32lower :: Alphabet
b32lower :: Alphabet
b32lower = String -> Alphabet
mkAlphabet (String -> Alphabet) -> String -> Alphabet
forall a b. (a -> b) -> a -> b
$ [Char
'a' .. Char
'z'] String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
'2' .. Char
'7']

b32upper :: Alphabet
b32upper :: Alphabet
b32upper = String -> Alphabet
mkAlphabet (String -> Alphabet) -> String -> Alphabet
forall a b. (a -> b) -> a -> b
$ [Char
'A' .. Char
'Z'] String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
'2' .. Char
'7']

b32hexupper :: Alphabet
b32hexupper :: Alphabet
b32hexupper = String -> Alphabet
mkAlphabet (String -> Alphabet) -> String -> Alphabet
forall a b. (a -> b) -> a -> b
$ [Char
'0'] String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
'1' .. Char
'9'] String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
'A' .. Char
'V']

b32hexlower :: Alphabet
b32hexlower :: Alphabet
b32hexlower = String -> Alphabet
mkAlphabet (String -> Alphabet) -> String -> Alphabet
forall a b. (a -> b) -> a -> b
$ [Char
'0'] String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
'1' .. Char
'9'] String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
'a' .. Char
'v']

-- | Represents base64 w/o padding implemented.
b64 :: Alphabet
b64 :: Alphabet
b64 =
  String -> Alphabet
mkAlphabet (String -> Alphabet) -> String -> Alphabet
forall a b. (a -> b) -> a -> b
$
    [Char
'A' .. Char
'Z']
      String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
'a' .. Char
'z']
      String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
'0']
      String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
'1' .. Char
'9']
      String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
'+', Char
'/']

-- | Represents base64 w/o padding implemented.
b64url :: Alphabet
b64url :: Alphabet
b64url =
  String -> Alphabet
mkAlphabet (String -> Alphabet) -> String -> Alphabet
forall a b. (a -> b) -> a -> b
$
    [Char
'A' .. Char
'Z']
      String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
'a' .. Char
'z']
      String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
'0']
      String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
'1' .. Char
'9']
      String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
'-', Char
'_']