{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} module Worldcup.Events (Events, Event(..), parseEvents, lookupEvent) where import Data.Aeson import Data.Aeson.Types as AET import Data.HashMap.Strict as HM import Data.Maybe as M import Prelude as P type Events = HashMap Int Event data Event = Event { eventId :: Int, eventName :: String } deriving (Show) instance FromJSON Event where parseJSON = withObject "event" $ \o -> do eventId <- o .: "id" eventName <- o .: "key" return Event{..} lookupEvent :: Int -> Events -> Event lookupEvent _id es = M.fromMaybe (Event 999 "DNE") (HM.lookup _id es) parseEvents :: Either String [Value] -> Events parseEvents (Left x) = error x parseEvents (Right xs) = P.foldl reduce HM.empty xs where reduce acc x = case (parseEither parseJSON x :: Either String Event) of (Left s) -> error s (Right v) -> HM.insert (eventId v) v acc