You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
3.3 KiB
97 lines
3.3 KiB
{-# LANGUAGE OverloadedStrings #-}
|
|
{-# LANGUAGE RecordWildCards #-}
|
|
|
|
import Data.Aeson as AE
|
|
import Data.Aeson.Types as AET
|
|
import Data.ByteString.Lazy as BL
|
|
import Data.ByteString.Lazy.Char8 as BL8
|
|
import Prelude as P
|
|
|
|
-- THIS "id":1
|
|
-- "key":null CHECKED, NULL
|
|
-- THIS "round_id":1 round title join
|
|
-- "pos":1 RANKING? NOT USING
|
|
-- "group_id":null
|
|
-- THIS "team1_id":45
|
|
-- THIS "team2_id":30
|
|
-- THIS "play_at":"2011-11-11 12:00:00.000000"
|
|
-- "postponed":"f" CHECKED, NULL
|
|
-- "play_at_v2":null CHECKED, NULL
|
|
-- "play_at_v3":null CHECKED, NULL
|
|
-- "ground_id":null CHECKED, NULL
|
|
-- "city_id":null CHECKED, NULL
|
|
-- "knockout":"f"
|
|
-- "home":"t"
|
|
-- THIS "score1":1 regular time
|
|
-- THIS "score2":0 regular time
|
|
-- THIS "score1et":null extended time
|
|
-- THIS "score2et":null extended time
|
|
-- THIS "score1p":null penalty time
|
|
-- THIS "score2p":null penalty time
|
|
--
|
|
-- "score1i":null CHECKED, NULL
|
|
-- "score2i":null CHECKED, NULL
|
|
-- "score1ii":null CHECKED, NULL
|
|
-- "score2ii":null CHECKED, NULL
|
|
-- "next_game_id":null CHECKED, NULL
|
|
-- "prev_game_id":null CHECKED, NULL
|
|
-- "winner":1
|
|
-- "winner90":1
|
|
-- "created_at":"2016-09-28 03:35:02.277055"
|
|
-- "updated_at":"2016-09-28 03:35:02.277055"
|
|
|
|
data Game = Game {
|
|
round_id :: Value,
|
|
team1_id :: Value,
|
|
team2_id :: Value,
|
|
playAt :: Value,
|
|
score1 :: Value,
|
|
score2 :: Value,
|
|
score1et :: Value,
|
|
score2et :: Value,
|
|
score1p :: Value,
|
|
score2p :: Value } deriving (Show)
|
|
|
|
instance ToJSON Game where
|
|
toJSON Game{..} = object [
|
|
"rId" .= round_id,
|
|
"t1" .= team1_id,
|
|
"t2" .= team2_id,
|
|
"ts" .= playAt,
|
|
"s1" .= score1,
|
|
"s2" .= score2,
|
|
"s1e" .= score1et,
|
|
"s2e" .= score2et,
|
|
"s1p" .= score1p,
|
|
"s2p" .= score2p ]
|
|
|
|
instance FromJSON Game where
|
|
parseJSON = withObject "game" $ \o -> do
|
|
round_id <- o .: "round_id"
|
|
team1_id <- o .: "team1_id"
|
|
team2_id <- o .: "team2_id"
|
|
playAt <- o .: "play_at"
|
|
score1 <- o .: "score1"
|
|
score2 <- o .: "score2"
|
|
score1et <- o .: "score1et"
|
|
score2et <- o .: "score2et"
|
|
score1p <- o .: "score1p"
|
|
score2p <- o .: "score2p"
|
|
return Game{..}
|
|
|
|
reduce :: [Game] -> Value -> [Game]
|
|
reduce acc x = case (parseEither parseJSON x :: Either String Game) of
|
|
(Left s) -> error s
|
|
(Right v) -> v : acc
|
|
|
|
parseGames :: Either String [Value] -> [Game]
|
|
parseGames (Left x) = error x
|
|
parseGames (Right xs) = P.foldl reduce [] xs
|
|
|
|
main :: IO ()
|
|
main = do
|
|
src <- BL.readFile "./data/games.json"
|
|
let games = parseGames (AE.eitherDecode src :: Either String [Value])
|
|
let encoded = encode games
|
|
BL8.putStrLn encoded
|
|
BL.writeFile "games.json" encoded
|
|
|