module Rattletrap.Type.Property.Array where

import qualified Rattletrap.ByteGet as ByteGet
import qualified Rattletrap.BytePut as BytePut
import qualified Rattletrap.Schema as Schema
import qualified Rattletrap.Type.Dictionary as Dictionary
import qualified Rattletrap.Type.List as RList
import qualified Rattletrap.Utility.Json as Json

newtype Array a
  = Array (RList.List (Dictionary.Dictionary a))
  deriving (Array a -> Array a -> Bool
(Array a -> Array a -> Bool)
-> (Array a -> Array a -> Bool) -> Eq (Array a)
forall a. Eq a => Array a -> Array a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => Array a -> Array a -> Bool
== :: Array a -> Array a -> Bool
$c/= :: forall a. Eq a => Array a -> Array a -> Bool
/= :: Array a -> Array a -> Bool
Eq, Int -> Array a -> ShowS
[Array a] -> ShowS
Array a -> String
(Int -> Array a -> ShowS)
-> (Array a -> String) -> ([Array a] -> ShowS) -> Show (Array a)
forall a. Show a => Int -> Array a -> ShowS
forall a. Show a => [Array a] -> ShowS
forall a. Show a => Array a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> Array a -> ShowS
showsPrec :: Int -> Array a -> ShowS
$cshow :: forall a. Show a => Array a -> String
show :: Array a -> String
$cshowList :: forall a. Show a => [Array a] -> ShowS
showList :: [Array a] -> ShowS
Show)

fromList :: RList.List (Dictionary.Dictionary a) -> Array a
fromList :: forall a. List (Dictionary a) -> Array a
fromList = List (Dictionary a) -> Array a
forall a. List (Dictionary a) -> Array a
Array

toList :: Array a -> RList.List (Dictionary.Dictionary a)
toList :: forall a. Array a -> List (Dictionary a)
toList (Array List (Dictionary a)
x) = List (Dictionary a)
x

instance (Json.FromJSON a) => Json.FromJSON (Array a) where
  parseJSON :: Value -> Parser (Array a)
parseJSON = (List (Dictionary a) -> Array a)
-> Parser (List (Dictionary a)) -> Parser (Array a)
forall a b. (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap List (Dictionary a) -> Array a
forall a. List (Dictionary a) -> Array a
fromList (Parser (List (Dictionary a)) -> Parser (Array a))
-> (Value -> Parser (List (Dictionary a)))
-> Value
-> Parser (Array a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Parser (List (Dictionary a))
forall a. FromJSON a => Value -> Parser a
Json.parseJSON

instance (Json.ToJSON a) => Json.ToJSON (Array a) where
  toJSON :: Array a -> Value
toJSON = List (Dictionary a) -> Value
forall a. ToJSON a => a -> Value
Json.toJSON (List (Dictionary a) -> Value)
-> (Array a -> List (Dictionary a)) -> Array a -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array a -> List (Dictionary a)
forall a. Array a -> List (Dictionary a)
toList

schema :: Schema.Schema -> Schema.Schema
schema :: Schema -> Schema
schema Schema
s =
  String -> Value -> Schema
Schema.named String
"property-array" (Value -> Schema) -> (Schema -> Value) -> Schema -> Schema
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Schema -> Value
Schema.json (Schema -> Value) -> (Schema -> Schema) -> Schema -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Schema -> Schema
RList.schema (Schema -> Schema) -> Schema -> Schema
forall a b. (a -> b) -> a -> b
$
    Schema -> Schema
Dictionary.schema
      Schema
s

bytePut :: (a -> BytePut.BytePut) -> Array a -> BytePut.BytePut
bytePut :: forall a. (a -> BytePut) -> Array a -> BytePut
bytePut a -> BytePut
f = (Dictionary a -> BytePut) -> List (Dictionary a) -> BytePut
forall a. (a -> BytePut) -> List a -> BytePut
RList.bytePut ((a -> BytePut) -> Dictionary a -> BytePut
forall a. (a -> BytePut) -> Dictionary a -> BytePut
Dictionary.bytePut a -> BytePut
f) (List (Dictionary a) -> BytePut)
-> (Array a -> List (Dictionary a)) -> Array a -> BytePut
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array a -> List (Dictionary a)
forall a. Array a -> List (Dictionary a)
toList

byteGet :: ByteGet.ByteGet a -> ByteGet.ByteGet (Array a)
byteGet :: forall a. ByteGet a -> ByteGet (Array a)
byteGet =
  String -> ByteGet (Array a) -> ByteGet (Array a)
forall a. String -> ByteGet a -> ByteGet a
ByteGet.label String
"Array" (ByteGet (Array a) -> ByteGet (Array a))
-> (ByteGet a -> ByteGet (Array a))
-> ByteGet a
-> ByteGet (Array a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (List (Dictionary a) -> Array a)
-> Get ByteString Identity (List (Dictionary a))
-> ByteGet (Array a)
forall a b.
(a -> b) -> Get ByteString Identity a -> Get ByteString Identity b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap List (Dictionary a) -> Array a
forall a. List (Dictionary a) -> Array a
fromList (Get ByteString Identity (List (Dictionary a))
 -> ByteGet (Array a))
-> (ByteGet a -> Get ByteString Identity (List (Dictionary a)))
-> ByteGet a
-> ByteGet (Array a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteGet (Dictionary a)
-> Get ByteString Identity (List (Dictionary a))
forall a. ByteGet a -> ByteGet (List a)
RList.byteGet (ByteGet (Dictionary a)
 -> Get ByteString Identity (List (Dictionary a)))
-> (ByteGet a -> ByteGet (Dictionary a))
-> ByteGet a
-> Get ByteString Identity (List (Dictionary a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteGet a -> ByteGet (Dictionary a)
forall a. ByteGet a -> ByteGet (Dictionary a)
Dictionary.byteGet