module LiterateX.Types.CodeLanguage
(
CodeLanguage
) where
import Control.Monad (when)
import Data.Bifunctor (first)
import Data.Char (isSpace)
import Data.String (IsString(fromString))
import qualified Data.Text as T
import Data.Text (Text)
import qualified Data.TTC as TTC
newtype CodeLanguage = CodeLanguage { CodeLanguage -> Text
unCodeLanguage :: Text }
deriving (CodeLanguage -> CodeLanguage -> Bool
(CodeLanguage -> CodeLanguage -> Bool)
-> (CodeLanguage -> CodeLanguage -> Bool) -> Eq CodeLanguage
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CodeLanguage -> CodeLanguage -> Bool
$c/= :: CodeLanguage -> CodeLanguage -> Bool
== :: CodeLanguage -> CodeLanguage -> Bool
$c== :: CodeLanguage -> CodeLanguage -> Bool
Eq, Eq CodeLanguage
Eq CodeLanguage
-> (CodeLanguage -> CodeLanguage -> Ordering)
-> (CodeLanguage -> CodeLanguage -> Bool)
-> (CodeLanguage -> CodeLanguage -> Bool)
-> (CodeLanguage -> CodeLanguage -> Bool)
-> (CodeLanguage -> CodeLanguage -> Bool)
-> (CodeLanguage -> CodeLanguage -> CodeLanguage)
-> (CodeLanguage -> CodeLanguage -> CodeLanguage)
-> Ord CodeLanguage
CodeLanguage -> CodeLanguage -> Bool
CodeLanguage -> CodeLanguage -> Ordering
CodeLanguage -> CodeLanguage -> CodeLanguage
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: CodeLanguage -> CodeLanguage -> CodeLanguage
$cmin :: CodeLanguage -> CodeLanguage -> CodeLanguage
max :: CodeLanguage -> CodeLanguage -> CodeLanguage
$cmax :: CodeLanguage -> CodeLanguage -> CodeLanguage
>= :: CodeLanguage -> CodeLanguage -> Bool
$c>= :: CodeLanguage -> CodeLanguage -> Bool
> :: CodeLanguage -> CodeLanguage -> Bool
$c> :: CodeLanguage -> CodeLanguage -> Bool
<= :: CodeLanguage -> CodeLanguage -> Bool
$c<= :: CodeLanguage -> CodeLanguage -> Bool
< :: CodeLanguage -> CodeLanguage -> Bool
$c< :: CodeLanguage -> CodeLanguage -> Bool
compare :: CodeLanguage -> CodeLanguage -> Ordering
$ccompare :: CodeLanguage -> CodeLanguage -> Ordering
$cp1Ord :: Eq CodeLanguage
Ord, Int -> CodeLanguage -> ShowS
[CodeLanguage] -> ShowS
CodeLanguage -> String
(Int -> CodeLanguage -> ShowS)
-> (CodeLanguage -> String)
-> ([CodeLanguage] -> ShowS)
-> Show CodeLanguage
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CodeLanguage] -> ShowS
$cshowList :: [CodeLanguage] -> ShowS
show :: CodeLanguage -> String
$cshow :: CodeLanguage -> String
showsPrec :: Int -> CodeLanguage -> ShowS
$cshowsPrec :: Int -> CodeLanguage -> ShowS
Show)
instance IsString CodeLanguage where
fromString :: String -> CodeLanguage
fromString = (String -> CodeLanguage)
-> (CodeLanguage -> CodeLanguage)
-> Either String CodeLanguage
-> CodeLanguage
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either String -> CodeLanguage
forall a. HasCallStack => String -> a
error CodeLanguage -> CodeLanguage
forall a. a -> a
id (Either String CodeLanguage -> CodeLanguage)
-> (String -> Either String CodeLanguage) -> String -> CodeLanguage
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Either String CodeLanguage
forall a t e. (Parse a, Textual t, Textual e) => t -> Either e a
TTC.parse
instance TTC.Parse CodeLanguage where
parse :: t -> Either e CodeLanguage
parse = (Text -> Either e CodeLanguage) -> t -> Either e CodeLanguage
forall t a. Textual t => (Text -> a) -> t -> a
TTC.asT ((Text -> Either e CodeLanguage) -> t -> Either e CodeLanguage)
-> (Text -> Either e CodeLanguage) -> t -> Either e CodeLanguage
forall a b. (a -> b) -> a -> b
$ \Text
t -> (String -> e)
-> Either String CodeLanguage -> Either e CodeLanguage
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first String -> e
forall t. Textual t => String -> t
TTC.fromS (Either String CodeLanguage -> Either e CodeLanguage)
-> Either String CodeLanguage -> Either e CodeLanguage
forall a b. (a -> b) -> a -> b
$ do
Bool -> Either String () -> Either String ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Text -> Bool
T.null Text
t) (Either String () -> Either String ())
-> Either String () -> Either String ()
forall a b. (a -> b) -> a -> b
$ String -> Either String ()
forall a b. a -> Either a b
Left String
"invalid code language: empty"
Bool -> Either String () -> Either String ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when ((Char -> Bool) -> Text -> Bool
T.any Char -> Bool
isSpace Text
t) (Either String () -> Either String ())
-> Either String () -> Either String ()
forall a b. (a -> b) -> a -> b
$ String -> Either String ()
forall a b. a -> Either a b
Left String
"invalid code language: contains whitespace"
CodeLanguage -> Either String CodeLanguage
forall (m :: * -> *) a. Monad m => a -> m a
return (CodeLanguage -> Either String CodeLanguage)
-> CodeLanguage -> Either String CodeLanguage
forall a b. (a -> b) -> a -> b
$ Text -> CodeLanguage
CodeLanguage Text
t
instance TTC.Render CodeLanguage where
render :: CodeLanguage -> t
render = Text -> t
forall t. Textual t => Text -> t
TTC.fromT (Text -> t) -> (CodeLanguage -> Text) -> CodeLanguage -> t
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CodeLanguage -> Text
unCodeLanguage