38 lines
1.2 KiB
Haskell
38 lines
1.2 KiB
Haskell
|
{-# LANGUAGE OverloadedStrings #-}
|
||
|
module Algorithm.BaseQuery
|
||
|
( superType,
|
||
|
Card(..)
|
||
|
) where
|
||
|
import qualified Data.Text as T
|
||
|
import Database.SQLite.Simple
|
||
|
import Config (getDbPath)
|
||
|
import Data.Text (Text, isInfixOf)
|
||
|
import Control.Monad.IO.Class (MonadIO(liftIO))
|
||
|
data Card = Card
|
||
|
Int
|
||
|
T.Text
|
||
|
T.Text
|
||
|
T.Text
|
||
|
(Maybe T.Text)
|
||
|
(Maybe T.Text)
|
||
|
T.Text
|
||
|
deriving (Show)
|
||
|
|
||
|
instance FromRow Card where
|
||
|
fromRow = Card <$> field <*> field <*> field <*> field <*> field <*> field <*> field
|
||
|
|
||
|
instance ToRow Card where
|
||
|
toRow (Card id_ scryfall_id lang name oracle_text image_uri type_line) = toRow (id_, scryfall_id, lang, name, oracle_text, image_uri, type_line)
|
||
|
|
||
|
|
||
|
superType :: String -> IO [Card]
|
||
|
superType qry = do
|
||
|
dbPath <- getDbPath
|
||
|
conn <- open dbPath
|
||
|
res <- query_ conn "select id, scryfall_id, lang, name, oracle_text, image_uri, type_line from card where type_line is not null" :: IO [Card];
|
||
|
return $ typeLineFilter res (T.pack qry)
|
||
|
|
||
|
typeLineFilter :: [Card] -> Text -> [Card]
|
||
|
typeLineFilter (card@(Card _ _ _ _ _ _ type_line):cards) qry = if qry `isInfixOf` type_line then card:typeLineFilter cards qry else typeLineFilter cards qry
|
||
|
|
||
|
typeLineFilter [] _ = []
|