module ASCII.Superset (
CharSuperset (..),
asCharUnsafe, toCharMaybe, toCharOrFail, toCharSub, substituteChar, convertCharMaybe, convertCharOrFail,
StringSuperset (..),
toCharListMaybe, toCharListOrFail, convertStringMaybe, convertStringOrFail
) where
import Control.Monad ( return )
import Control.Monad.Fail ( MonadFail (fail) )
import Data.Bool ( Bool, (&&) )
import Data.Function ( (.), id )
import Data.Functor ( fmap )
import Data.Ord ( (<=), (>=) )
import Data.Maybe ( Maybe (..) )
import qualified ASCII.Char as ASCII
import qualified Data.Bool as Bool
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as LBS
import qualified Data.ByteString.Builder as BSB
import qualified Data.Char as Unicode
import qualified Data.Int as Int
import qualified Data.List as List
import qualified Data.Text as T
import qualified Data.Text.Lazy as LT
import qualified Data.Text.Lazy.Builder as TB
import qualified Data.Word as Word
import qualified Numeric.Natural as Nat
import qualified Prelude
class CharSuperset char
where
isAsciiChar :: char -> Bool
fromChar :: ASCII.Char -> char
toCharUnsafe :: char -> ASCII.Char
asCharUnsafe :: CharSuperset char => (ASCII.Char -> ASCII.Char) -> char -> char
asCharUnsafe :: (Char -> Char) -> char -> char
asCharUnsafe Char -> Char
f = Char -> char
forall char. CharSuperset char => Char -> char
fromChar (Char -> char) -> (char -> Char) -> char -> char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Char
f (Char -> Char) -> (char -> Char) -> char -> Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. char -> Char
forall char. CharSuperset char => char -> Char
toCharUnsafe
toCharMaybe :: CharSuperset char => char -> Maybe ASCII.Char
toCharMaybe :: char -> Maybe Char
toCharMaybe = char -> Maybe Char
forall char (context :: * -> *).
(CharSuperset char, MonadFail context) =>
char -> context Char
toCharOrFail
toCharOrFail :: (CharSuperset char, MonadFail context) => char -> context ASCII.Char
toCharOrFail :: char -> context Char
toCharOrFail char
x = if char -> Bool
forall char. CharSuperset char => char -> Bool
isAsciiChar char
x then Char -> context Char
forall (m :: * -> *) a. Monad m => a -> m a
return (char -> Char
forall char. CharSuperset char => char -> Char
toCharUnsafe char
x) else String -> context Char
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"Not an ASCII character"
toCharSub :: CharSuperset char => char -> ASCII.Char
toCharSub :: char -> Char
toCharSub char
x = if char -> Bool
forall char. CharSuperset char => char -> Bool
isAsciiChar char
x then char -> Char
forall char. CharSuperset char => char -> Char
toCharUnsafe char
x else Char
ASCII.Substitute
substituteChar :: CharSuperset char => char -> char
substituteChar :: char -> char
substituteChar char
x = if char -> Bool
forall char. CharSuperset char => char -> Bool
isAsciiChar char
x then char
x else Char -> char
forall char. CharSuperset char => Char -> char
fromChar Char
ASCII.Substitute
convertCharMaybe :: (CharSuperset char1, CharSuperset char2) => char1 -> Maybe char2
convertCharMaybe :: char1 -> Maybe char2
convertCharMaybe = char1 -> Maybe char2
forall char1 char2 (context :: * -> *).
(CharSuperset char1, CharSuperset char2, MonadFail context) =>
char1 -> context char2
convertCharOrFail
convertCharOrFail :: (CharSuperset char1, CharSuperset char2, MonadFail context) => char1 -> context char2
convertCharOrFail :: char1 -> context char2
convertCharOrFail = (Char -> char2) -> context Char -> context char2
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Char -> char2
forall char. CharSuperset char => Char -> char
fromChar (context Char -> context char2)
-> (char1 -> context Char) -> char1 -> context char2
forall b c a. (b -> c) -> (a -> b) -> a -> c
. char1 -> context Char
forall char (context :: * -> *).
(CharSuperset char, MonadFail context) =>
char -> context Char
toCharOrFail
class StringSuperset string
where
isAsciiString :: string -> Bool
fromCharList :: [ASCII.Char] -> string
toCharListUnsafe :: string -> [ASCII.Char]
toCharListSub :: string -> [ASCII.Char]
substituteString :: string -> string
mapCharsUnsafe :: (ASCII.Char -> ASCII.Char) -> string -> string
mapCharsUnsafe Char -> Char
f = [Char] -> string
forall string. StringSuperset string => [Char] -> string
fromCharList ([Char] -> string) -> (string -> [Char]) -> string -> string
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Char) -> [Char] -> [Char]
forall a b. (a -> b) -> [a] -> [b]
List.map Char -> Char
f ([Char] -> [Char]) -> (string -> [Char]) -> string -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. string -> [Char]
forall string. StringSuperset string => string -> [Char]
toCharListUnsafe
toCharListMaybe :: StringSuperset string => string -> Maybe [ASCII.Char]
toCharListMaybe :: string -> Maybe [Char]
toCharListMaybe = string -> Maybe [Char]
forall string (context :: * -> *).
(StringSuperset string, MonadFail context) =>
string -> context [Char]
toCharListOrFail
toCharListOrFail :: (StringSuperset string, MonadFail context) => string -> context [ASCII.Char]
toCharListOrFail :: string -> context [Char]
toCharListOrFail string
x = if string -> Bool
forall string. StringSuperset string => string -> Bool
isAsciiString string
x then [Char] -> context [Char]
forall (m :: * -> *) a. Monad m => a -> m a
return (string -> [Char]
forall string. StringSuperset string => string -> [Char]
toCharListUnsafe string
x) else String -> context [Char]
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"String contains non-ASCII characters"
convertStringMaybe :: (StringSuperset string1, StringSuperset string2) => string1 -> Maybe string2
convertStringMaybe :: string1 -> Maybe string2
convertStringMaybe = string1 -> Maybe string2
forall string1 string2 (context :: * -> *).
(StringSuperset string1, StringSuperset string2,
MonadFail context) =>
string1 -> context string2
convertStringOrFail
convertStringOrFail :: (StringSuperset string1, StringSuperset string2, MonadFail context) => string1 -> context string2
convertStringOrFail :: string1 -> context string2
convertStringOrFail = ([Char] -> string2) -> context [Char] -> context string2
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [Char] -> string2
forall string. StringSuperset string => [Char] -> string
fromCharList (context [Char] -> context string2)
-> (string1 -> context [Char]) -> string1 -> context string2
forall b c a. (b -> c) -> (a -> b) -> a -> c
. string1 -> context [Char]
forall string (context :: * -> *).
(StringSuperset string, MonadFail context) =>
string -> context [Char]
toCharListOrFail
instance CharSuperset ASCII.Char
where
isAsciiChar :: Char -> Bool
isAsciiChar Char
_ = Bool
Bool.True
fromChar :: Char -> Char
fromChar = Char -> Char
forall a. a -> a
id
toCharUnsafe :: Char -> Char
toCharUnsafe = Char -> Char
forall a. a -> a
id
instance CharSuperset Unicode.Char
where
isAsciiChar :: Char -> Bool
isAsciiChar = (Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
'\DEL')
fromChar :: Char -> Char
fromChar = Int -> Char
Unicode.chr (Int -> Char) -> (Char -> Int) -> Char -> Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Int
ASCII.toInt
toCharUnsafe :: Char -> Char
toCharUnsafe = Int -> Char
ASCII.fromIntUnsafe (Int -> Char) -> (Char -> Int) -> Char -> Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Int
Unicode.ord
instance CharSuperset Nat.Natural
where
isAsciiChar :: Natural -> Bool
isAsciiChar = (Natural -> Natural -> Bool
forall a. Ord a => a -> a -> Bool
<= Natural
127)
fromChar :: Char -> Natural
fromChar = Int -> Natural
forall a b. (Integral a, Num b) => a -> b
Prelude.fromIntegral (Int -> Natural) -> (Char -> Int) -> Char -> Natural
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Int
ASCII.toInt
toCharUnsafe :: Natural -> Char
toCharUnsafe = Int -> Char
ASCII.fromIntUnsafe (Int -> Char) -> (Natural -> Int) -> Natural -> Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Natural -> Int
forall a b. (Integral a, Num b) => a -> b
Prelude.fromIntegral
instance CharSuperset Int.Int
where
isAsciiChar :: Int -> Bool
isAsciiChar Int
x = (Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
0) Bool -> Bool -> Bool
&& (Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
127)
fromChar :: Char -> Int
fromChar = Char -> Int
ASCII.toInt
toCharUnsafe :: Int -> Char
toCharUnsafe = Int -> Char
ASCII.fromIntUnsafe
instance CharSuperset Word.Word8
where
isAsciiChar :: Word8 -> Bool
isAsciiChar = (Word8 -> Word8 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word8
127)
fromChar :: Char -> Word8
fromChar = Int -> Word8
forall a b. (Integral a, Num b) => a -> b
Prelude.fromIntegral (Int -> Word8) -> (Char -> Int) -> Char -> Word8
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Int
ASCII.toInt
toCharUnsafe :: Word8 -> Char
toCharUnsafe = Int -> Char
ASCII.fromIntUnsafe (Int -> Char) -> (Word8 -> Int) -> Word8 -> Char
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
Prelude.fromIntegral
instance CharSuperset char => StringSuperset [char]
where
isAsciiString :: [char] -> Bool
isAsciiString = (char -> Bool) -> [char] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
List.all char -> Bool
forall char. CharSuperset char => char -> Bool
isAsciiChar
fromCharList :: [Char] -> [char]
fromCharList = (Char -> char) -> [Char] -> [char]
forall a b. (a -> b) -> [a] -> [b]
List.map Char -> char
forall char. CharSuperset char => Char -> char
fromChar
toCharListUnsafe :: [char] -> [Char]
toCharListUnsafe = (char -> Char) -> [char] -> [Char]
forall a b. (a -> b) -> [a] -> [b]
List.map char -> Char
forall char. CharSuperset char => char -> Char
toCharUnsafe
toCharListSub :: [char] -> [Char]
toCharListSub = (char -> Char) -> [char] -> [Char]
forall a b. (a -> b) -> [a] -> [b]
List.map char -> Char
forall char. CharSuperset char => char -> Char
toCharSub
substituteString :: [char] -> [char]
substituteString = (char -> char) -> [char] -> [char]
forall a b. (a -> b) -> [a] -> [b]
List.map char -> char
forall char. CharSuperset char => char -> char
substituteChar
instance StringSuperset T.Text
where
isAsciiString :: Text -> Bool
isAsciiString = (Char -> Bool) -> Text -> Bool
T.all Char -> Bool
forall char. CharSuperset char => char -> Bool
isAsciiChar
fromCharList :: [Char] -> Text
fromCharList = String -> Text
T.pack (String -> Text) -> ([Char] -> String) -> [Char] -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> String
forall string. StringSuperset string => [Char] -> string
fromCharList
toCharListUnsafe :: Text -> [Char]
toCharListUnsafe = String -> [Char]
forall string. StringSuperset string => string -> [Char]
toCharListUnsafe (String -> [Char]) -> (Text -> String) -> Text -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
T.unpack
toCharListSub :: Text -> [Char]
toCharListSub = String -> [Char]
forall string. StringSuperset string => string -> [Char]
toCharListSub (String -> [Char]) -> (Text -> String) -> Text -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
T.unpack
substituteString :: Text -> Text
substituteString = (Char -> Char) -> Text -> Text
T.map Char -> Char
forall char. CharSuperset char => char -> char
substituteChar
mapCharsUnsafe :: (Char -> Char) -> Text -> Text
mapCharsUnsafe Char -> Char
f = (Char -> Char) -> Text -> Text
T.map ((Char -> Char) -> Char -> Char
forall char. CharSuperset char => (Char -> Char) -> char -> char
asCharUnsafe Char -> Char
f)
instance StringSuperset LT.Text
where
isAsciiString :: Text -> Bool
isAsciiString = (Char -> Bool) -> Text -> Bool
LT.all Char -> Bool
forall char. CharSuperset char => char -> Bool
isAsciiChar
fromCharList :: [Char] -> Text
fromCharList = String -> Text
LT.pack (String -> Text) -> ([Char] -> String) -> [Char] -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> String
forall string. StringSuperset string => [Char] -> string
fromCharList
toCharListUnsafe :: Text -> [Char]
toCharListUnsafe = String -> [Char]
forall string. StringSuperset string => string -> [Char]
toCharListUnsafe (String -> [Char]) -> (Text -> String) -> Text -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
LT.unpack
toCharListSub :: Text -> [Char]
toCharListSub = String -> [Char]
forall string. StringSuperset string => string -> [Char]
toCharListSub (String -> [Char]) -> (Text -> String) -> Text -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
LT.unpack
substituteString :: Text -> Text
substituteString = (Char -> Char) -> Text -> Text
LT.map Char -> Char
forall char. CharSuperset char => char -> char
substituteChar
mapCharsUnsafe :: (Char -> Char) -> Text -> Text
mapCharsUnsafe Char -> Char
f = (Char -> Char) -> Text -> Text
LT.map ((Char -> Char) -> Char -> Char
forall char. CharSuperset char => (Char -> Char) -> char -> char
asCharUnsafe Char -> Char
f)
instance StringSuperset TB.Builder
where
isAsciiString :: Builder -> Bool
isAsciiString = Text -> Bool
forall string. StringSuperset string => string -> Bool
isAsciiString (Text -> Bool) -> (Builder -> Text) -> Builder -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Text
TB.toLazyText
fromCharList :: [Char] -> Builder
fromCharList = String -> Builder
TB.fromString (String -> Builder) -> ([Char] -> String) -> [Char] -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> String
forall string. StringSuperset string => [Char] -> string
fromCharList
toCharListUnsafe :: Builder -> [Char]
toCharListUnsafe = Text -> [Char]
forall string. StringSuperset string => string -> [Char]
toCharListUnsafe (Text -> [Char]) -> (Builder -> Text) -> Builder -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Text
TB.toLazyText
toCharListSub :: Builder -> [Char]
toCharListSub = Text -> [Char]
forall string. StringSuperset string => string -> [Char]
toCharListSub (Text -> [Char]) -> (Builder -> Text) -> Builder -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Text
TB.toLazyText
substituteString :: Builder -> Builder
substituteString = Text -> Builder
TB.fromLazyText (Text -> Builder) -> (Builder -> Text) -> Builder -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Text
forall string. StringSuperset string => string -> string
substituteString (Text -> Text) -> (Builder -> Text) -> Builder -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Text
TB.toLazyText
mapCharsUnsafe :: (Char -> Char) -> Builder -> Builder
mapCharsUnsafe Char -> Char
f = Text -> Builder
TB.fromLazyText (Text -> Builder) -> (Builder -> Text) -> Builder -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Char) -> Text -> Text
forall string.
StringSuperset string =>
(Char -> Char) -> string -> string
mapCharsUnsafe Char -> Char
f (Text -> Text) -> (Builder -> Text) -> Builder -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Text
TB.toLazyText
instance StringSuperset BS.ByteString
where
isAsciiString :: ByteString -> Bool
isAsciiString = (Word8 -> Bool) -> ByteString -> Bool
BS.all Word8 -> Bool
forall char. CharSuperset char => char -> Bool
isAsciiChar
fromCharList :: [Char] -> ByteString
fromCharList = [Word8] -> ByteString
BS.pack ([Word8] -> ByteString)
-> ([Char] -> [Word8]) -> [Char] -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> [Word8]
forall string. StringSuperset string => [Char] -> string
fromCharList
toCharListUnsafe :: ByteString -> [Char]
toCharListUnsafe = [Word8] -> [Char]
forall string. StringSuperset string => string -> [Char]
toCharListUnsafe ([Word8] -> [Char])
-> (ByteString -> [Word8]) -> ByteString -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> [Word8]
BS.unpack
toCharListSub :: ByteString -> [Char]
toCharListSub = [Word8] -> [Char]
forall string. StringSuperset string => string -> [Char]
toCharListSub ([Word8] -> [Char])
-> (ByteString -> [Word8]) -> ByteString -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> [Word8]
BS.unpack
substituteString :: ByteString -> ByteString
substituteString = (Word8 -> Word8) -> ByteString -> ByteString
BS.map Word8 -> Word8
forall char. CharSuperset char => char -> char
substituteChar
mapCharsUnsafe :: (Char -> Char) -> ByteString -> ByteString
mapCharsUnsafe Char -> Char
f = (Word8 -> Word8) -> ByteString -> ByteString
BS.map ((Char -> Char) -> Word8 -> Word8
forall char. CharSuperset char => (Char -> Char) -> char -> char
asCharUnsafe Char -> Char
f)
instance StringSuperset LBS.ByteString
where
isAsciiString :: ByteString -> Bool
isAsciiString = (Word8 -> Bool) -> ByteString -> Bool
LBS.all Word8 -> Bool
forall char. CharSuperset char => char -> Bool
isAsciiChar
fromCharList :: [Char] -> ByteString
fromCharList = [Word8] -> ByteString
LBS.pack ([Word8] -> ByteString)
-> ([Char] -> [Word8]) -> [Char] -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> [Word8]
forall string. StringSuperset string => [Char] -> string
fromCharList
toCharListUnsafe :: ByteString -> [Char]
toCharListUnsafe = [Word8] -> [Char]
forall string. StringSuperset string => string -> [Char]
toCharListUnsafe ([Word8] -> [Char])
-> (ByteString -> [Word8]) -> ByteString -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> [Word8]
LBS.unpack
toCharListSub :: ByteString -> [Char]
toCharListSub = [Word8] -> [Char]
forall string. StringSuperset string => string -> [Char]
toCharListSub ([Word8] -> [Char])
-> (ByteString -> [Word8]) -> ByteString -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> [Word8]
LBS.unpack
substituteString :: ByteString -> ByteString
substituteString = (Word8 -> Word8) -> ByteString -> ByteString
LBS.map Word8 -> Word8
forall char. CharSuperset char => char -> char
substituteChar
mapCharsUnsafe :: (Char -> Char) -> ByteString -> ByteString
mapCharsUnsafe Char -> Char
f = (Word8 -> Word8) -> ByteString -> ByteString
LBS.map ((Char -> Char) -> Word8 -> Word8
forall char. CharSuperset char => (Char -> Char) -> char -> char
asCharUnsafe Char -> Char
f)
instance StringSuperset BSB.Builder
where
isAsciiString :: Builder -> Bool
isAsciiString = ByteString -> Bool
forall string. StringSuperset string => string -> Bool
isAsciiString (ByteString -> Bool) -> (Builder -> ByteString) -> Builder -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> ByteString
BSB.toLazyByteString
fromCharList :: [Char] -> Builder
fromCharList = ByteString -> Builder
BSB.lazyByteString (ByteString -> Builder)
-> ([Char] -> ByteString) -> [Char] -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> ByteString
forall string. StringSuperset string => [Char] -> string
fromCharList
toCharListUnsafe :: Builder -> [Char]
toCharListUnsafe = ByteString -> [Char]
forall string. StringSuperset string => string -> [Char]
toCharListUnsafe (ByteString -> [Char])
-> (Builder -> ByteString) -> Builder -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> ByteString
BSB.toLazyByteString
toCharListSub :: Builder -> [Char]
toCharListSub = ByteString -> [Char]
forall string. StringSuperset string => string -> [Char]
toCharListSub (ByteString -> [Char])
-> (Builder -> ByteString) -> Builder -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> ByteString
BSB.toLazyByteString
substituteString :: Builder -> Builder
substituteString = ByteString -> Builder
BSB.lazyByteString (ByteString -> Builder)
-> (Builder -> ByteString) -> Builder -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
forall string. StringSuperset string => string -> string
substituteString (ByteString -> ByteString)
-> (Builder -> ByteString) -> Builder -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> ByteString
BSB.toLazyByteString
mapCharsUnsafe :: (Char -> Char) -> Builder -> Builder
mapCharsUnsafe Char -> Char
f = ByteString -> Builder
BSB.lazyByteString (ByteString -> Builder)
-> (Builder -> ByteString) -> Builder -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Char) -> ByteString -> ByteString
forall string.
StringSuperset string =>
(Char -> Char) -> string -> string
mapCharsUnsafe Char -> Char
f (ByteString -> ByteString)
-> (Builder -> ByteString) -> Builder -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> ByteString
BSB.toLazyByteString