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 List
import qualified Rattletrap.Utility.Json as Json

newtype Array a
  = Array (List.List (Dictionary.Dictionary a))
  deriving (Array a -> Array a -> Bool
forall a. Eq a => Array a -> Array a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Array a -> Array a -> Bool
$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
Eq, Int -> Array a -> ShowS
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
showList :: [Array a] -> ShowS
$cshowList :: forall a. Show a => [Array a] -> ShowS
show :: Array a -> String
$cshow :: forall a. Show a => Array a -> String
showsPrec :: Int -> Array a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> Array a -> ShowS
Show)

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

toList :: Array a -> List.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 = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. List (Dictionary a) -> Array a
fromList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. FromJSON a => Value -> Parser a
Json.parseJSON

instance (Json.ToJSON a) => Json.ToJSON (Array a) where
  toJSON :: Array a -> Value
toJSON = forall a. ToJSON a => a -> Value
Json.toJSON forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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" forall b c a. (b -> c) -> (a -> b) -> a -> c
. Schema -> Value
Schema.json forall b c a. (b -> c) -> (a -> b) -> a -> c
. Schema -> Schema
List.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 = forall a. (a -> BytePut) -> List a -> BytePut
List.bytePut (forall a. (a -> BytePut) -> Dictionary a -> BytePut
Dictionary.bytePut a -> BytePut
f) forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 =
  forall a. String -> ByteGet a -> ByteGet a
ByteGet.label String
"Array" forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. List (Dictionary a) -> Array a
fromList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. ByteGet a -> ByteGet (List a)
List.byteGet forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. ByteGet a -> ByteGet (Dictionary a)
Dictionary.byteGet