{-# LANGUAGE Trustworthy #-}
module Web.Mangrove.Parse.Common.Character
( CharacterReferenceTree ( .. )
, ReferenceValue ( .. )
, lookupCharacterReference
, characterReferences
) where
import qualified Data.Aeson as J
import qualified Data.Bifunctor as F.B
import qualified Data.Either as E
import qualified Data.HashMap.Strict as M
import qualified Data.Text as T
import qualified System.IO.Unsafe as IO.Unsafe
import Paths_mangrove
import Control.Applicative ( (<|>) )
import Data.Aeson ( (.:) )
import System.FilePath ( (<.>) )
newtype CharacterReferenceTree =
CharacterReferenceTree (M.HashMap Char (Maybe ReferenceValue, CharacterReferenceTree))
deriving ( CharacterReferenceTree -> CharacterReferenceTree -> Bool
(CharacterReferenceTree -> CharacterReferenceTree -> Bool)
-> (CharacterReferenceTree -> CharacterReferenceTree -> Bool)
-> Eq CharacterReferenceTree
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CharacterReferenceTree -> CharacterReferenceTree -> Bool
$c/= :: CharacterReferenceTree -> CharacterReferenceTree -> Bool
== :: CharacterReferenceTree -> CharacterReferenceTree -> Bool
$c== :: CharacterReferenceTree -> CharacterReferenceTree -> Bool
Eq, Int -> CharacterReferenceTree -> ShowS
[CharacterReferenceTree] -> ShowS
CharacterReferenceTree -> String
(Int -> CharacterReferenceTree -> ShowS)
-> (CharacterReferenceTree -> String)
-> ([CharacterReferenceTree] -> ShowS)
-> Show CharacterReferenceTree
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CharacterReferenceTree] -> ShowS
$cshowList :: [CharacterReferenceTree] -> ShowS
show :: CharacterReferenceTree -> String
$cshow :: CharacterReferenceTree -> String
showsPrec :: Int -> CharacterReferenceTree -> ShowS
$cshowsPrec :: Int -> CharacterReferenceTree -> ShowS
Show, ReadPrec [CharacterReferenceTree]
ReadPrec CharacterReferenceTree
Int -> ReadS CharacterReferenceTree
ReadS [CharacterReferenceTree]
(Int -> ReadS CharacterReferenceTree)
-> ReadS [CharacterReferenceTree]
-> ReadPrec CharacterReferenceTree
-> ReadPrec [CharacterReferenceTree]
-> Read CharacterReferenceTree
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CharacterReferenceTree]
$creadListPrec :: ReadPrec [CharacterReferenceTree]
readPrec :: ReadPrec CharacterReferenceTree
$creadPrec :: ReadPrec CharacterReferenceTree
readList :: ReadS [CharacterReferenceTree]
$creadList :: ReadS [CharacterReferenceTree]
readsPrec :: Int -> ReadS CharacterReferenceTree
$creadsPrec :: Int -> ReadS CharacterReferenceTree
Read )
data ReferenceValue = ReferenceValue
{ ReferenceValue -> Bool
isSemicolonOptional :: Bool
, ReferenceValue -> String
referenceValue :: String
}
deriving ( ReferenceValue -> ReferenceValue -> Bool
(ReferenceValue -> ReferenceValue -> Bool)
-> (ReferenceValue -> ReferenceValue -> Bool) -> Eq ReferenceValue
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ReferenceValue -> ReferenceValue -> Bool
$c/= :: ReferenceValue -> ReferenceValue -> Bool
== :: ReferenceValue -> ReferenceValue -> Bool
$c== :: ReferenceValue -> ReferenceValue -> Bool
Eq, Int -> ReferenceValue -> ShowS
[ReferenceValue] -> ShowS
ReferenceValue -> String
(Int -> ReferenceValue -> ShowS)
-> (ReferenceValue -> String)
-> ([ReferenceValue] -> ShowS)
-> Show ReferenceValue
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ReferenceValue] -> ShowS
$cshowList :: [ReferenceValue] -> ShowS
show :: ReferenceValue -> String
$cshow :: ReferenceValue -> String
showsPrec :: Int -> ReferenceValue -> ShowS
$cshowsPrec :: Int -> ReferenceValue -> ShowS
Show, ReadPrec [ReferenceValue]
ReadPrec ReferenceValue
Int -> ReadS ReferenceValue
ReadS [ReferenceValue]
(Int -> ReadS ReferenceValue)
-> ReadS [ReferenceValue]
-> ReadPrec ReferenceValue
-> ReadPrec [ReferenceValue]
-> Read ReferenceValue
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [ReferenceValue]
$creadListPrec :: ReadPrec [ReferenceValue]
readPrec :: ReadPrec ReferenceValue
$creadPrec :: ReadPrec ReferenceValue
readList :: ReadS [ReferenceValue]
$creadList :: ReadS [ReferenceValue]
readsPrec :: Int -> ReadS ReferenceValue
$creadsPrec :: Int -> ReadS ReferenceValue
Read )
lookupCharacterReference :: String -> Maybe ReferenceValue
lookupCharacterReference :: String -> Maybe ReferenceValue
lookupCharacterReference = CharacterReferenceTree -> String -> Maybe ReferenceValue
lookupCharacterReference' CharacterReferenceTree
characterReferences (String -> Maybe ReferenceValue)
-> ShowS -> String -> Maybe ReferenceValue
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
dropAmpersand
where dropAmpersand :: ShowS
dropAmpersand (Char
'&':String
cs) = String
cs
dropAmpersand String
cs = String
cs
lookupCharacterReference' :: CharacterReferenceTree -> String -> Maybe ReferenceValue
lookupCharacterReference' :: CharacterReferenceTree -> String -> Maybe ReferenceValue
lookupCharacterReference' CharacterReferenceTree
_ [] = Maybe ReferenceValue
forall a. Maybe a
Nothing
lookupCharacterReference' (CharacterReferenceTree HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
refs) [Char
c] = Char
-> HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
-> Maybe (Maybe ReferenceValue, CharacterReferenceTree)
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
M.lookup Char
c HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
refs Maybe (Maybe ReferenceValue, CharacterReferenceTree)
-> ((Maybe ReferenceValue, CharacterReferenceTree)
-> Maybe ReferenceValue)
-> Maybe ReferenceValue
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Maybe ReferenceValue, CharacterReferenceTree)
-> Maybe ReferenceValue
forall a b. (a, b) -> a
fst
lookupCharacterReference' (CharacterReferenceTree HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
refs) [Char
c, Char
';'] = Char
-> HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
-> Maybe (Maybe ReferenceValue, CharacterReferenceTree)
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
M.lookup Char
c HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
refs Maybe (Maybe ReferenceValue, CharacterReferenceTree)
-> ((Maybe ReferenceValue, CharacterReferenceTree)
-> Maybe ReferenceValue)
-> Maybe ReferenceValue
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Maybe ReferenceValue, CharacterReferenceTree)
-> Maybe ReferenceValue
forall a b. (a, b) -> a
fst
lookupCharacterReference' (CharacterReferenceTree HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
refs) (Char
c:String
cs) = do
(Maybe ReferenceValue
_, CharacterReferenceTree
refs') <- Char
-> HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
-> Maybe (Maybe ReferenceValue, CharacterReferenceTree)
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
M.lookup Char
c HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
refs
CharacterReferenceTree -> String -> Maybe ReferenceValue
lookupCharacterReference' CharacterReferenceTree
refs' String
cs
characterReferences :: CharacterReferenceTree
characterReferences :: CharacterReferenceTree
characterReferences = IO CharacterReferenceTree -> CharacterReferenceTree
forall a. IO a -> a
IO.Unsafe.unsafePerformIO (IO CharacterReferenceTree -> CharacterReferenceTree)
-> IO CharacterReferenceTree -> CharacterReferenceTree
forall a b. (a -> b) -> a -> b
$ do
String
entities <- String -> IO String
getDataFileName (String -> IO String) -> String -> IO String
forall a b. (a -> b) -> a -> b
$ String
"entities" String -> ShowS
<.> String
"json"
CharacterReferenceTree
-> (HashMap String CharacterData -> CharacterReferenceTree)
-> Maybe (HashMap String CharacterData)
-> CharacterReferenceTree
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
-> CharacterReferenceTree
CharacterReferenceTree HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
forall k v. HashMap k v
M.empty) HashMap String CharacterData -> CharacterReferenceTree
repackReferences (Maybe (HashMap String CharacterData) -> CharacterReferenceTree)
-> IO (Maybe (HashMap String CharacterData))
-> IO CharacterReferenceTree
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> IO (Maybe (HashMap String CharacterData))
forall a. FromJSON a => String -> IO (Maybe a)
J.decodeFileStrict String
entities
{-# NOINLINE characterReferences #-}
repackReferences :: M.HashMap String CharacterData -> CharacterReferenceTree
repackReferences :: HashMap String CharacterData -> CharacterReferenceTree
repackReferences = ((String, CharacterData)
-> CharacterReferenceTree -> CharacterReferenceTree)
-> CharacterReferenceTree
-> [(String, CharacterData)]
-> CharacterReferenceTree
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr ((String, String)
-> CharacterReferenceTree -> CharacterReferenceTree
repackReferences' ((String, String)
-> CharacterReferenceTree -> CharacterReferenceTree)
-> ((String, CharacterData) -> (String, String))
-> (String, CharacterData)
-> CharacterReferenceTree
-> CharacterReferenceTree
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
-> (CharacterData -> String)
-> (String, CharacterData)
-> (String, String)
forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
F.B.bimap (Int -> ShowS
forall a. Int -> [a] -> [a]
drop Int
1) ((Int -> Char) -> [Int] -> String
forall a b. (a -> b) -> [a] -> [b]
map Int -> Char
forall a. Enum a => Int -> a
toEnum ([Int] -> String)
-> (CharacterData -> [Int]) -> CharacterData -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CharacterData -> [Int]
codepoints))
(HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
-> CharacterReferenceTree
CharacterReferenceTree HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
forall k v. HashMap k v
M.empty) ([(String, CharacterData)] -> CharacterReferenceTree)
-> (HashMap String CharacterData -> [(String, CharacterData)])
-> HashMap String CharacterData
-> CharacterReferenceTree
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HashMap String CharacterData -> [(String, CharacterData)]
forall k v. HashMap k v -> [(k, v)]
M.toList
repackReferences' :: (String, String) -> CharacterReferenceTree -> CharacterReferenceTree
repackReferences' :: (String, String)
-> CharacterReferenceTree -> CharacterReferenceTree
repackReferences' (String, String)
ref (CharacterReferenceTree HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
refs) = HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
-> CharacterReferenceTree
CharacterReferenceTree (HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
-> CharacterReferenceTree)
-> HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
-> CharacterReferenceTree
forall a b. (a -> b) -> a -> b
$
((Maybe ReferenceValue, CharacterReferenceTree)
-> (Maybe ReferenceValue, CharacterReferenceTree)
-> (Maybe ReferenceValue, CharacterReferenceTree))
-> HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
-> HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
-> HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
forall k v.
(Eq k, Hashable k) =>
(v -> v -> v) -> HashMap k v -> HashMap k v -> HashMap k v
M.unionWith (Maybe ReferenceValue, CharacterReferenceTree)
-> (Maybe ReferenceValue, CharacterReferenceTree)
-> (Maybe ReferenceValue, CharacterReferenceTree)
joinTree ((String, String)
-> HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
singletonReferenceTree (String, String)
ref) HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
refs
joinTree
:: (Maybe ReferenceValue, CharacterReferenceTree)
-> (Maybe ReferenceValue, CharacterReferenceTree)
-> (Maybe ReferenceValue, CharacterReferenceTree)
joinTree :: (Maybe ReferenceValue, CharacterReferenceTree)
-> (Maybe ReferenceValue, CharacterReferenceTree)
-> (Maybe ReferenceValue, CharacterReferenceTree)
joinTree (Maybe ReferenceValue
l, CharacterReferenceTree HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
ls) (Maybe ReferenceValue
r, CharacterReferenceTree HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
rs) =
((ReferenceValue -> ReferenceValue)
-> Maybe ReferenceValue -> Maybe ReferenceValue
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ReferenceValue -> ReferenceValue
checkOptional (Maybe ReferenceValue -> Maybe ReferenceValue)
-> Maybe ReferenceValue -> Maybe ReferenceValue
forall a b. (a -> b) -> a -> b
$ Maybe ReferenceValue
l Maybe ReferenceValue
-> Maybe ReferenceValue -> Maybe ReferenceValue
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Maybe ReferenceValue
r, HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
-> CharacterReferenceTree
CharacterReferenceTree (HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
-> CharacterReferenceTree)
-> HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
-> CharacterReferenceTree
forall a b. (a -> b) -> a -> b
$ ((Maybe ReferenceValue, CharacterReferenceTree)
-> (Maybe ReferenceValue, CharacterReferenceTree)
-> (Maybe ReferenceValue, CharacterReferenceTree))
-> HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
-> HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
-> HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
forall k v.
(Eq k, Hashable k) =>
(v -> v -> v) -> HashMap k v -> HashMap k v -> HashMap k v
M.unionWith (Maybe ReferenceValue, CharacterReferenceTree)
-> (Maybe ReferenceValue, CharacterReferenceTree)
-> (Maybe ReferenceValue, CharacterReferenceTree)
joinTree HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
ls HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
rs)
where checkOptional :: ReferenceValue -> ReferenceValue
checkOptional ReferenceValue
ref = ReferenceValue
ref
{ isSemicolonOptional :: Bool
isSemicolonOptional =
Bool -> (ReferenceValue -> Bool) -> Maybe ReferenceValue -> Bool
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
False ReferenceValue -> Bool
isSemicolonOptional Maybe ReferenceValue
l Bool -> Bool -> Bool
|| Bool -> (ReferenceValue -> Bool) -> Maybe ReferenceValue -> Bool
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
False ReferenceValue -> Bool
isSemicolonOptional Maybe ReferenceValue
r
}
singletonReferenceTree
:: (String, String)
-> M.HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
singletonReferenceTree :: (String, String)
-> HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
singletonReferenceTree (String
key, String
ref) = HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
-> Either
Bool (HashMap Char (Maybe ReferenceValue, CharacterReferenceTree))
-> HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
forall b a. b -> Either a b -> b
E.fromRight HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
forall k v. HashMap k v
M.empty (Either
Bool (HashMap Char (Maybe ReferenceValue, CharacterReferenceTree))
-> HashMap Char (Maybe ReferenceValue, CharacterReferenceTree))
-> Either
Bool (HashMap Char (Maybe ReferenceValue, CharacterReferenceTree))
-> HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
forall a b. (a -> b) -> a -> b
$
(Char
-> Either
Bool (HashMap Char (Maybe ReferenceValue, CharacterReferenceTree))
-> Either
Bool (HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)))
-> Either
Bool (HashMap Char (Maybe ReferenceValue, CharacterReferenceTree))
-> String
-> Either
Bool (HashMap Char (Maybe ReferenceValue, CharacterReferenceTree))
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Char
-> Either
Bool (HashMap Char (Maybe ReferenceValue, CharacterReferenceTree))
-> Either
Bool (HashMap Char (Maybe ReferenceValue, CharacterReferenceTree))
singletonReferenceTree' (Bool
-> Either
Bool (HashMap Char (Maybe ReferenceValue, CharacterReferenceTree))
forall a b. a -> Either a b
Left Bool
True) String
key
where singletonReferenceTree' :: Char
-> Either
Bool (HashMap Char (Maybe ReferenceValue, CharacterReferenceTree))
-> Either
Bool (HashMap Char (Maybe ReferenceValue, CharacterReferenceTree))
singletonReferenceTree' Char
';' Either
Bool (HashMap Char (Maybe ReferenceValue, CharacterReferenceTree))
_ = Bool
-> Either
Bool (HashMap Char (Maybe ReferenceValue, CharacterReferenceTree))
forall a b. a -> Either a b
Left Bool
False
singletonReferenceTree' Char
c (Left Bool
semicolon) = HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
-> Either
Bool (HashMap Char (Maybe ReferenceValue, CharacterReferenceTree))
forall a b. b -> Either a b
Right (HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
-> Either
Bool (HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)))
-> HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
-> Either
Bool (HashMap Char (Maybe ReferenceValue, CharacterReferenceTree))
forall a b. (a -> b) -> a -> b
$
Char
-> (Maybe ReferenceValue, CharacterReferenceTree)
-> HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
forall k v. Hashable k => k -> v -> HashMap k v
M.singleton Char
c (ReferenceValue -> Maybe ReferenceValue
forall a. a -> Maybe a
Just (ReferenceValue -> Maybe ReferenceValue)
-> ReferenceValue -> Maybe ReferenceValue
forall a b. (a -> b) -> a -> b
$ Bool -> String -> ReferenceValue
ReferenceValue Bool
semicolon String
ref, HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
-> CharacterReferenceTree
CharacterReferenceTree HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
forall k v. HashMap k v
M.empty)
singletonReferenceTree' Char
c (Right HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
ref') = HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
-> Either
Bool (HashMap Char (Maybe ReferenceValue, CharacterReferenceTree))
forall a b. b -> Either a b
Right (HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
-> Either
Bool (HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)))
-> HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
-> Either
Bool (HashMap Char (Maybe ReferenceValue, CharacterReferenceTree))
forall a b. (a -> b) -> a -> b
$
Char
-> (Maybe ReferenceValue, CharacterReferenceTree)
-> HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
forall k v. Hashable k => k -> v -> HashMap k v
M.singleton Char
c (Maybe ReferenceValue
forall a. Maybe a
Nothing, HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
-> CharacterReferenceTree
CharacterReferenceTree HashMap Char (Maybe ReferenceValue, CharacterReferenceTree)
ref')
newtype CharacterData = CharacterData
{ CharacterData -> [Int]
codepoints :: [Int]
}
deriving ( CharacterData -> CharacterData -> Bool
(CharacterData -> CharacterData -> Bool)
-> (CharacterData -> CharacterData -> Bool) -> Eq CharacterData
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CharacterData -> CharacterData -> Bool
$c/= :: CharacterData -> CharacterData -> Bool
== :: CharacterData -> CharacterData -> Bool
$c== :: CharacterData -> CharacterData -> Bool
Eq, Int -> CharacterData -> ShowS
[CharacterData] -> ShowS
CharacterData -> String
(Int -> CharacterData -> ShowS)
-> (CharacterData -> String)
-> ([CharacterData] -> ShowS)
-> Show CharacterData
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CharacterData] -> ShowS
$cshowList :: [CharacterData] -> ShowS
show :: CharacterData -> String
$cshow :: CharacterData -> String
showsPrec :: Int -> CharacterData -> ShowS
$cshowsPrec :: Int -> CharacterData -> ShowS
Show, ReadPrec [CharacterData]
ReadPrec CharacterData
Int -> ReadS CharacterData
ReadS [CharacterData]
(Int -> ReadS CharacterData)
-> ReadS [CharacterData]
-> ReadPrec CharacterData
-> ReadPrec [CharacterData]
-> Read CharacterData
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CharacterData]
$creadListPrec :: ReadPrec [CharacterData]
readPrec :: ReadPrec CharacterData
$creadPrec :: ReadPrec CharacterData
readList :: ReadS [CharacterData]
$creadList :: ReadS [CharacterData]
readsPrec :: Int -> ReadS CharacterData
$creadsPrec :: Int -> ReadS CharacterData
Read )
instance J.FromJSON CharacterData where
parseJSON :: Value -> Parser CharacterData
parseJSON = String
-> (Object -> Parser CharacterData)
-> Value
-> Parser CharacterData
forall a. String -> (Object -> Parser a) -> Value -> Parser a
J.withObject String
"reference" ((Object -> Parser CharacterData) -> Value -> Parser CharacterData)
-> (Object -> Parser CharacterData)
-> Value
-> Parser CharacterData
forall a b. (a -> b) -> a -> b
$ \Object
v -> [Int] -> CharacterData
CharacterData
([Int] -> CharacterData) -> Parser [Int] -> Parser CharacterData
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Text -> Parser [Int]
forall a. FromJSON a => Object -> Text -> Parser a
.: String -> Text
T.pack String
"codepoints"