{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE TemplateHaskell #-}

module Language.Eberban.Dictionaries
( officialDictionary
) where

import Language.Eberban.Core
import qualified Data.Text as T
import qualified Data.Text.Encoding as TE
import qualified Data.Map as M
import qualified Data.Yaml as Y
import Data.FileEmbed (embedFile)

-- | Official Dictionary
officialDictionary :: Dictionary
officialDictionary :: Dictionary
officialDictionary = Text -> Map Text Entry -> Dictionary
Dictionary Text
"official" Map Text Entry
entryMap where
    entryList :: [Entry]
entryList = Text -> [Entry]
loadEntriesFromYamlText (Text -> [Entry]) -> Text -> [Entry]
forall a b. (a -> b) -> a -> b
$ ByteString -> Text
TE.decodeUtf8 $(embedFile "resources/language/eberban/words.yaml")
    entryMap :: Map Text Entry
entryMap = [(Text, Entry)] -> Map Text Entry
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList ([(Text, Entry)] -> Map Text Entry)
-> [(Text, Entry)] -> Map Text Entry
forall a b. (a -> b) -> a -> b
$ (Entry -> (Text, Entry)) -> [Entry] -> [(Text, Entry)]
forall a b. (a -> b) -> [a] -> [b]
map (\Entry
entry -> (Entry -> Text
entryText Entry
entry, Entry
entry)) [Entry]
entryList

-- | Loads entries from yaml-encoded text.
loadEntriesFromYamlText :: T.Text -> [Entry]
loadEntriesFromYamlText :: Text -> [Entry]
loadEntriesFromYamlText Text
yamlText = ((Text, Map Text Text) -> Entry)
-> [(Text, Map Text Text)] -> [Entry]
forall a b. (a -> b) -> [a] -> [b]
map (Text, Map Text Text) -> Entry
handleEntry [(Text, Map Text Text)]
yamlList where
    yamlData :: M.Map T.Text (M.Map T.Text T.Text)
    yamlData :: Map Text (Map Text Text)
yamlData = case ByteString -> Either [Char] (Map Text (Map Text Text))
forall a. FromJSON a => ByteString -> Either [Char] a
Y.decodeEither (ByteString -> Either [Char] (Map Text (Map Text Text)))
-> ByteString -> Either [Char] (Map Text (Map Text Text))
forall a b. (a -> b) -> a -> b
$ Text -> ByteString
TE.encodeUtf8 Text
yamlText of
        Left [Char]
msg -> [Char] -> Map Text (Map Text Text)
forall a. HasCallStack => [Char] -> a
error ([Char] -> Map Text (Map Text Text))
-> [Char] -> Map Text (Map Text Text)
forall a b. (a -> b) -> a -> b
$ [Char]
"Failed to load eberban entries: " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
msg
        Right Map Text (Map Text Text)
x -> Map Text (Map Text Text)
x
    yamlList :: [(T.Text, M.Map T.Text T.Text)]
    yamlList :: [(Text, Map Text Text)]
yamlList = Map Text (Map Text Text) -> [(Text, Map Text Text)]
forall k a. Map k a -> [(k, a)]
M.assocs Map Text (Map Text Text)
yamlData
    handleEntry :: (T.Text, M.Map T.Text T.Text) -> Entry
    handleEntry :: (Text, Map Text Text) -> Entry
handleEntry (Text
entryKey, Map Text Text
entryData) = Text -> Text -> Maybe Text -> Text -> Text -> Maybe Text -> Entry
Entry Text
entryKey Text
entryFamily Maybe Text
entrySignature Text
entryEnglishShort Text
entryEnglishLong Maybe Text
entryLojbanSimilar where
        entryFamily :: Text
entryFamily = (Map Text Text
entryData Map Text Text -> Text -> Text
forall k a. Ord k => Map k a -> k -> a
M.! Text
"_family")
        entrySignature :: Maybe Text
entrySignature = (Map Text Text
entryData Map Text Text -> Text -> Maybe Text
forall k a. Ord k => Map k a -> k -> Maybe a
M.!? Text
"_signature")
        entryEnglishShort :: Text
entryEnglishShort = (Map Text Text
entryData Map Text Text -> Text -> Text
forall k a. Ord k => Map k a -> k -> a
M.! Text
"eng_short")
        entryEnglishLong :: Text
entryEnglishLong = (Map Text Text
entryData Map Text Text -> Text -> Text
forall k a. Ord k => Map k a -> k -> a
M.! Text
"eng_long")
        entryLojbanSimilar :: Maybe Text
entryLojbanSimilar = (Map Text Text
entryData Map Text Text -> Text -> Maybe Text
forall k a. Ord k => Map k a -> k -> Maybe a
M.!? Text
"jbo_similar")