packages feed

typesafe-precure-0.4.0.0: src/ACME/PreCure/Index/Types.hs

{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -fno-warn-unused-top-binds #-}

module ACME.PreCure.Index.Types
  ( Girl(Girl)
  , Transformee(Transformee)
  , SpecialItem(SpecialItem)
  , IdAttachments(IdAttachments)
  , Transformation(Transformation)
  , Purification(Purification)
  , Index
  , mkGirl
  , mkTransformee
  , mkSpecialItem
  , mkIA
  , mkTransformation
  , mkPurification
  , mkIndex
  ) where

import           Data.Aeson
                   ( ToJSON
                   , toJSON
                   , object
                   , (.=)
                   )
import           Data.Data
                   ( Data
                   )
import           Data.String
                   ( IsString
                   , fromString
                   )

import           ACME.PreCure.Index.Lib


-- | Pair of the Girl data type name and their name
data Girl =
  Girl { girlId :: String, girlNameEn :: String, girlNameJa :: String }
    deriving (Eq, Show, Data)

$(deriveToJsonWithoutTypeNamePrefix ''Girl)

mkGirl :: String -> String -> Girl
mkGirl ne = Girl (head $ words ne) ne


data Transformee =
  Transformee
    { transformedId :: String
    , transformedNameEn :: String
    , transformedNameJa :: String
    , transformedIntroducesHerselfAs :: String
    , transformedVariation :: String
    } deriving (Eq, Show, Data)

$(deriveToJsonWithoutTypeNamePrefix ''Transformee)

mkTransformee :: String -> String -> String -> String -> Transformee
mkTransformee ne = Transformee (concat $ words ne) ne


data SpecialItem =
  SpecialItem
    { specialItemId :: String
    , specialItemNameEn :: String
    , specialItemNameJa :: String
    , specialItemAttachments :: [String]
    } deriving (Eq, Show, Data)

$(deriveToJsonWithoutTypeNamePrefix ''SpecialItem)

mkSpecialItem :: String -> String -> [String] -> SpecialItem
mkSpecialItem ne = SpecialItem (concat $ words ne) ne


data IdAttachments =
  IdAttachments
    { idAttachementsI :: String
    , idAttachementsA :: [IdAttachments]
    } deriving (Eq, Show, Data)

instance ToJSON IdAttachments where
  toJSON (IdAttachments i []) = toJSON i
  toJSON (IdAttachments i a) =
    object ["i" .= toJSON i, "a" .= toJSON a]

instance IsString IdAttachments where
  fromString s = mkIA s []


mkIA :: String -> [IdAttachments] -> IdAttachments
mkIA = IdAttachments


data Transformation =
  Transformation
    { transformationTransformers :: [IdAttachments]
    , transformationSpecialItems :: [IdAttachments]
    , transformationTransformees :: [String]
    , transformationSpeech :: [String]
    } deriving (Eq, Show, Data)

$(deriveToJsonWithoutTypeNamePrefix ''Transformation)

mkTransformation :: [IdAttachments] -> [IdAttachments] -> [String] -> [String] -> Transformation
mkTransformation = Transformation


data Purification =
  Purification
    { purificationPurifier :: [IdAttachments]
    , purificationSpecialItems :: [IdAttachments]
    , purificationSpeech :: [String]
    } deriving (Eq, Show, Data)

$(deriveToJsonWithoutTypeNamePrefix ''Purification)

mkPurification :: [IdAttachments] -> [IdAttachments] -> [String] -> Purification
mkPurification = Purification


data Index =
  Index
    { indexGirls :: [Girl]
    , indexTransformees :: [Transformee]
    , indexSpecialItems :: [SpecialItem]
    , indexTransformations :: [Transformation]
    , indexPurifications :: [Purification]
    } deriving (Eq, Show)

$(deriveToJsonWithoutTypeNamePrefix ''Index)

mkIndex
  :: [Girl]
  -> [Transformee]
  -> [SpecialItem]
  -> [Transformation]
  -> [Purification]
  -> Index
mkIndex = Index