module Codec.Tiled.World
  ( World(..)
  , empty
  ) where

import Data.Aeson (FromJSON(..), ToJSON(..), genericParseJSON, genericToJSON)
import Data.Text (Text)
import Data.Vector (Vector)
import GHC.Generics (Generic)

import Codec.Tiled.Aeson (mkOptions, remapFields_)
import Codec.Tiled.World.Map (Map)
import Codec.Tiled.World.Pattern (Pattern)

data World = World
  { World -> Maybe (Vector Map)
maps                 :: Maybe (Vector Map)
  , World -> Maybe (Vector Pattern)
patterns             :: Maybe (Vector Pattern)
  , World -> Maybe Text
type_                :: Maybe Text              -- ^ @world@ (for world files)
  , World -> Maybe Bool
onlyShowAdjacentMaps :: Maybe Bool
  }
  deriving (World -> World -> Bool
(World -> World -> Bool) -> (World -> World -> Bool) -> Eq World
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: World -> World -> Bool
$c/= :: World -> World -> Bool
== :: World -> World -> Bool
$c== :: World -> World -> Bool
Eq, Int -> World -> ShowS
[World] -> ShowS
World -> String
(Int -> World -> ShowS)
-> (World -> String) -> ([World] -> ShowS) -> Show World
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [World] -> ShowS
$cshowList :: [World] -> ShowS
show :: World -> String
$cshow :: World -> String
showsPrec :: Int -> World -> ShowS
$cshowsPrec :: Int -> World -> ShowS
Show, (forall x. World -> Rep World x)
-> (forall x. Rep World x -> World) -> Generic World
forall x. Rep World x -> World
forall x. World -> Rep World x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep World x -> World
$cfrom :: forall x. World -> Rep World x
Generic)

instance FromJSON World where
  parseJSON :: Value -> Parser World
parseJSON = Options -> Value -> Parser World
forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
genericParseJSON (ShowS -> Options
mkOptions ShowS
remapFields_)

instance ToJSON World where
  toJSON :: World -> Value
toJSON = Options -> World -> Value
forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON (ShowS -> Options
mkOptions ShowS
remapFields_)

empty :: World
empty :: World
empty = World :: Maybe (Vector Map)
-> Maybe (Vector Pattern) -> Maybe Text -> Maybe Bool -> World
World
  { maps :: Maybe (Vector Map)
maps                 = Maybe (Vector Map)
forall a. Maybe a
Nothing
  , patterns :: Maybe (Vector Pattern)
patterns             = Maybe (Vector Pattern)
forall a. Maybe a
Nothing
  , type_ :: Maybe Text
type_                = Maybe Text
forall a. Maybe a
Nothing
  , onlyShowAdjacentMaps :: Maybe Bool
onlyShowAdjacentMaps = Maybe Bool
forall a. Maybe a
Nothing
  }