-- | Module for converting between boolean values and strings containing '0's
-- | and '1's
module RealDice.Convert.BinaryString
  ( boolToBin,
    boolsToBin,
    binToBool,
    binToBools,
    stringToBools,
  )
where

-- | Converts a Bool to a '1' or '0'

-- | ==== __Examples__
--  >>> boolToBin True
--  '1'
--  >>> boolToBin False
--  '0'
boolToBin :: Bool -> Char
boolToBin :: Bool -> Char
boolToBin Bool
False = Char
'0'
boolToBin Bool
True = Char
'1'

-- | Converts a list of Bools to a binary string

-- | ==== __Examples__
-- >>> boolsToBin [True, False, True, True]
-- "1011"
boolsToBin :: [Bool] -> String
boolsToBin :: [Bool] -> String
boolsToBin = (Bool -> Char) -> [Bool] -> String
forall a b. (a -> b) -> [a] -> [b]
map Bool -> Char
boolToBin

-- | Converts a binary character to a Bool

-- | ==== __Examples__
-- >>> binToBool '0'
-- False
-- >>> binToBool '1'
-- True
-- >>> binToBool '2'
-- *** Exception: Invalid binary character: '2' (valid binary characters are '0' and '1')
binToBool :: Char -> Bool
binToBool :: Char -> Bool
binToBool Char
'0' = Bool
False
binToBool Char
'1' = Bool
True
binToBool Char
x =
  String -> Bool
forall a. HasCallStack => String -> a
error
    ( String
"Invalid binary character: '"
        String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
x]
        String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"' (valid binary characters are '0' and '1')"
    )

-- | Converts a binary string to a list of Bools

-- | ==== __Examples__
-- >>> binToBools "1011"
-- [True,False,True,True]
-- >>> binToBools "1012"
-- *** Exception: Invalid binary character: '2' (valid binary characters are '0' and '1')
binToBools :: String -> [Bool]
binToBools :: String -> [Bool]
binToBools = (Char -> Bool) -> String -> [Bool]
forall a b. (a -> b) -> [a] -> [b]
map Char -> Bool
binToBool

-- | Converts a string containing '0's and '1's to a list of Bools, ignoring
--   any characters that are not '0' or '1'

-- | ==== __Examples__
-- >>> stringToBools "1011"
-- [True,False,True,True]
-- >>> stringToBools "1012"
-- [True,False,True]
-- >>> stringToBools "Hello, Haskell!"
-- []
-- >>> stringToBools "On the 10th of March, 1901, Hacksell Kerry placed 21st\n\ \ in the 100m dash, with a time of 12.3 seconds, wearing the number 101"
-- [True,False,True,False,True,True,True,False,False,True,True,False,True]
stringToBools :: String -> [Bool]
stringToBools :: String -> [Bool]
stringToBools = [Bool] -> String -> [Bool]
acc []
  where
    acc :: [Bool] -> String -> [Bool]
    acc :: [Bool] -> String -> [Bool]
acc [Bool]
boolList [] = [Bool]
boolList
    acc [Bool]
boolList (Char
'0' : String
xs) = [Bool] -> String -> [Bool]
acc ([Bool]
boolList [Bool] -> [Bool] -> [Bool]
forall a. [a] -> [a] -> [a]
++ [Bool
False]) String
xs
    acc [Bool]
boolList (Char
'1' : String
xs) = [Bool] -> String -> [Bool]
acc ([Bool]
boolList [Bool] -> [Bool] -> [Bool]
forall a. [a] -> [a] -> [a]
++ [Bool
True]) String
xs
    acc [Bool]
boolList (Char
_ : String
xs) = [Bool] -> String -> [Bool]
acc [Bool]
boolList String
xs