module Server.Api.V0.Serializers ( serializeCourse , serializeDeck ) where import Core import Server.Core import Language.Lojban.Core import Server.Logic.Decks (computeCardProficiencyScore) import qualified Server.Api.V0.Contract as Contract import qualified Data.Map as M serializeCourse :: Course -> Contract.Course serializeCourse :: Course -> Course serializeCourse Course course = Text -> Text -> CourseStyle -> Course Contract.Course Text title Text dictionaryId CourseStyle style where title :: Text title = Course -> Text courseTitle Course course dictionaryId :: Text dictionaryId = Dictionary -> Text dictIdentifier (Course -> Dictionary courseDictionary Course course) style :: CourseStyle style = CourseStyle -> CourseStyle serializeCourseStyle (Course -> CourseStyle courseStyle Course course) serializeCourseStyle :: CourseStyle -> Contract.CourseStyle serializeCourseStyle :: CourseStyle -> CourseStyle serializeCourseStyle CourseStyle courseStyle = Maybe String -> Maybe String -> CourseStyle Contract.CourseStyle Maybe String color1 Maybe String iconUrl where color1 :: Maybe String color1 = CourseStyle -> Maybe String courseStyleColor1 CourseStyle courseStyle iconUrl :: Maybe String iconUrl = CourseStyle -> Maybe String courseStyleIconUrl CourseStyle courseStyle serializeDeck :: Deck -> Maybe DeckPreferences -> Maybe DeckProficiency -> Contract.Deck serializeDeck :: Deck -> Maybe DeckPreferences -> Maybe DeckProficiency -> Deck serializeDeck Deck deck Maybe DeckPreferences deckPreferences Maybe DeckProficiency deckProficiency = Text -> Text -> [Card] -> Maybe DeckPreferences -> Maybe DeckProficiency -> Deck Contract.Deck Text title Text dictionaryId [Card] cards Maybe DeckPreferences serializedDeckPreferences Maybe DeckProficiency serializedDeckProficiency where title :: Text title = Deck -> Text deckTitle Deck deck dictionaryId :: Text dictionaryId = Dictionary -> Text dictIdentifier (Deck -> Dictionary deckDictionary Deck deck) cards :: [Card] cards = (Card -> Card) -> [Card] -> [Card] forall a b. (a -> b) -> [a] -> [b] map Card -> Card serializeCard (Deck -> [Card] deckCards Deck deck) serializedDeckPreferences :: Maybe DeckPreferences serializedDeckPreferences = DeckPreferences -> DeckPreferences serializeDeckPreferences (DeckPreferences -> DeckPreferences) -> Maybe DeckPreferences -> Maybe DeckPreferences forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> Maybe DeckPreferences deckPreferences serializedDeckProficiency :: Maybe DeckProficiency serializedDeckProficiency = DeckProficiency -> DeckProficiency serializeDeckProficiency (DeckProficiency -> DeckProficiency) -> Maybe DeckProficiency -> Maybe DeckProficiency forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> Maybe DeckProficiency deckProficiency serializeCard :: Card -> Contract.Card serializeCard :: Card -> Card serializeCard Card card = Text -> Text -> Card Contract.Card Text title Text shortDescription where title :: Text title = Card -> Text cardTitle Card card shortDescription :: Text shortDescription = Card -> Text cardShortDescription Card card serializeDeckPreferences :: DeckPreferences -> Contract.DeckPreferences serializeDeckPreferences :: DeckPreferences -> DeckPreferences serializeDeckPreferences DeckPreferences deckPreferences = Map Text CardPreferences -> DeckPreferences Contract.DeckPreferences Map Text CardPreferences serializedCardPreferences where serializedCardPreferences :: Map Text CardPreferences serializedCardPreferences = (CardPreferences -> CardPreferences) -> Map Text CardPreferences -> Map Text CardPreferences forall a b k. (a -> b) -> Map k a -> Map k b M.map CardPreferences -> CardPreferences serializeCardPreferences (Map Text CardPreferences -> Map Text CardPreferences) -> Map Text CardPreferences -> Map Text CardPreferences forall a b. (a -> b) -> a -> b $ DeckPreferences -> Map Text CardPreferences cardPreferences DeckPreferences deckPreferences serializeCardPreferences :: CardPreferences -> Contract.CardPreferences serializeCardPreferences :: CardPreferences -> CardPreferences serializeCardPreferences CardPreferences cardPreferences = CardStatus -> CardPreferences Contract.CardPreferences CardStatus convertedStatus where convertedStatus :: CardStatus convertedStatus = case CardPreferences -> CardStatus cardStatus CardPreferences cardPreferences of CardStatus CardAlreadyMastered -> CardStatus Contract.AlreadyMastered CardStatus CardCurrentlyLearning -> CardStatus Contract.CurrentlyLearning CardStatus CardNotStarted -> CardStatus Contract.NotStarted serializeDeckProficiency :: DeckProficiency -> Contract.DeckProficiency serializeDeckProficiency :: DeckProficiency -> DeckProficiency serializeDeckProficiency DeckProficiency deckProficiency = Map Text CardProficiency -> DeckProficiency Contract.DeckProficiency Map Text CardProficiency serializedCardProficiency where serializedCardProficiency :: Map Text CardProficiency serializedCardProficiency = (CardProficiency -> CardProficiency) -> Map Text CardProficiency -> Map Text CardProficiency forall a b k. (a -> b) -> Map k a -> Map k b M.map CardProficiency -> CardProficiency serializeCardProficiency (Map Text CardProficiency -> Map Text CardProficiency) -> Map Text CardProficiency -> Map Text CardProficiency forall a b. (a -> b) -> a -> b $ DeckProficiency -> Map Text CardProficiency cardProficiencies DeckProficiency deckProficiency serializeCardProficiency :: CardProficiency -> Contract.CardProficiency serializeCardProficiency :: CardProficiency -> CardProficiency serializeCardProficiency CardProficiency cardProficiency = Double -> CardProficiency Contract.CardProficiency Double score where score :: Double score = CardProficiency -> Double computeCardProficiencyScore CardProficiency cardProficiency