module Rattletrap.Type.List where import qualified Rattletrap.ByteGet as ByteGet import qualified Rattletrap.BytePut as BytePut import qualified Rattletrap.Schema as Schema import qualified Rattletrap.Type.U32 as U32 import qualified Rattletrap.Utility.Json as Json import qualified Control.Monad as Monad newtype List a = List [a] deriving (List a -> List a -> Bool (List a -> List a -> Bool) -> (List a -> List a -> Bool) -> Eq (List a) forall a. Eq a => List a -> List a -> Bool forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a /= :: List a -> List a -> Bool $c/= :: forall a. Eq a => List a -> List a -> Bool == :: List a -> List a -> Bool $c== :: forall a. Eq a => List a -> List a -> Bool Eq, Int -> List a -> ShowS [List a] -> ShowS List a -> String (Int -> List a -> ShowS) -> (List a -> String) -> ([List a] -> ShowS) -> Show (List a) forall a. Show a => Int -> List a -> ShowS forall a. Show a => [List a] -> ShowS forall a. Show a => List a -> String forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a showList :: [List a] -> ShowS $cshowList :: forall a. Show a => [List a] -> ShowS show :: List a -> String $cshow :: forall a. Show a => List a -> String showsPrec :: Int -> List a -> ShowS $cshowsPrec :: forall a. Show a => Int -> List a -> ShowS Show) instance Json.FromJSON a => Json.FromJSON (List a) where parseJSON :: Value -> Parser (List a) parseJSON = ([a] -> List a) -> Parser [a] -> Parser (List a) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap [a] -> List a forall a. [a] -> List a fromList (Parser [a] -> Parser (List a)) -> (Value -> Parser [a]) -> Value -> Parser (List a) forall b c a. (b -> c) -> (a -> b) -> a -> c . Value -> Parser [a] forall a. FromJSON a => Value -> Parser a Json.parseJSON instance Json.ToJSON a => Json.ToJSON (List a) where toJSON :: List a -> Value toJSON = [a] -> Value forall a. ToJSON a => a -> Value Json.toJSON ([a] -> Value) -> (List a -> [a]) -> List a -> Value forall b c a. (b -> c) -> (a -> b) -> a -> c . List a -> [a] forall a. List a -> [a] toList schema :: Schema.Schema -> Schema.Schema schema :: Schema -> Schema schema = Schema -> Schema Schema.array fromList :: [a] -> List a fromList :: [a] -> List a fromList = [a] -> List a forall a. [a] -> List a List empty :: List a empty :: List a empty = [a] -> List a forall a. [a] -> List a fromList [] toList :: List a -> [a] toList :: List a -> [a] toList (List [a] x) = [a] x bytePut :: (a -> BytePut.BytePut) -> List a -> BytePut.BytePut bytePut :: (a -> BytePut) -> List a -> BytePut bytePut a -> BytePut f List a x = let v :: [a] v = List a -> [a] forall a. List a -> [a] toList List a x in (U32 -> BytePut U32.bytePut (U32 -> BytePut) -> (Int -> U32) -> Int -> BytePut forall b c a. (b -> c) -> (a -> b) -> a -> c . Word32 -> U32 U32.fromWord32 (Word32 -> U32) -> (Int -> Word32) -> Int -> U32 forall b c a. (b -> c) -> (a -> b) -> a -> c . Int -> Word32 forall a b. (Integral a, Num b) => a -> b fromIntegral (Int -> BytePut) -> Int -> BytePut forall a b. (a -> b) -> a -> b $ [a] -> Int forall (t :: * -> *) a. Foldable t => t a -> Int length [a] v) BytePut -> BytePut -> BytePut forall a. Semigroup a => a -> a -> a <> (a -> BytePut) -> [a] -> BytePut forall (t :: * -> *) m a. (Foldable t, Monoid m) => (a -> m) -> t a -> m foldMap a -> BytePut f [a] v byteGet :: ByteGet.ByteGet a -> ByteGet.ByteGet (List a) byteGet :: ByteGet a -> ByteGet (List a) byteGet ByteGet a f = do U32 size <- ByteGet U32 U32.byteGet Int -> ByteGet a -> ByteGet (List a) forall (m :: * -> *) a. Monad m => Int -> m a -> m (List a) replicateM (Word32 -> Int forall a b. (Integral a, Num b) => a -> b fromIntegral (Word32 -> Int) -> Word32 -> Int forall a b. (a -> b) -> a -> b $ U32 -> Word32 U32.toWord32 U32 size) ByteGet a f replicateM :: Monad m => Int -> m a -> m (List a) replicateM :: Int -> m a -> m (List a) replicateM Int n = ([a] -> List a) -> m [a] -> m (List a) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap [a] -> List a forall a. [a] -> List a fromList (m [a] -> m (List a)) -> (m a -> m [a]) -> m a -> m (List a) forall b c a. (b -> c) -> (a -> b) -> a -> c . Int -> m a -> m [a] forall (m :: * -> *) a. Applicative m => Int -> m a -> m [a] Monad.replicateM Int n untilM :: Monad m => m (Maybe a) -> m (List a) untilM :: m (Maybe a) -> m (List a) untilM m (Maybe a) f = m (Maybe a) -> Int -> [(Int, a)] -> m (List a) forall (m :: * -> *) a. Monad m => m (Maybe a) -> Int -> [(Int, a)] -> m (List a) untilMWith m (Maybe a) f Int 0 [] untilMWith :: Monad m => m (Maybe a) -> Int -> [(Int, a)] -> m (List a) untilMWith :: m (Maybe a) -> Int -> [(Int, a)] -> m (List a) untilMWith m (Maybe a) f Int i [(Int, a)] xs = do Maybe a m <- m (Maybe a) f case Maybe a m of Maybe a Nothing -> List a -> m (List a) forall (f :: * -> *) a. Applicative f => a -> f a pure (List a -> m (List a)) -> ([a] -> List a) -> [a] -> m (List a) forall b c a. (b -> c) -> (a -> b) -> a -> c . [a] -> List a forall a. [a] -> List a fromList ([a] -> List a) -> ([a] -> [a]) -> [a] -> List a forall b c a. (b -> c) -> (a -> b) -> a -> c . [a] -> [a] forall a. [a] -> [a] reverse ([a] -> m (List a)) -> [a] -> m (List a) forall a b. (a -> b) -> a -> b $ ((Int, a) -> a) -> [(Int, a)] -> [a] forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap (Int, a) -> a forall a b. (a, b) -> b snd [(Int, a)] xs Just a x -> m (Maybe a) -> Int -> [(Int, a)] -> m (List a) forall (m :: * -> *) a. Monad m => m (Maybe a) -> Int -> [(Int, a)] -> m (List a) untilMWith m (Maybe a) f (Int i Int -> Int -> Int forall a. Num a => a -> a -> a + Int 1) ((Int i, a x) (Int, a) -> [(Int, a)] -> [(Int, a)] forall a. a -> [a] -> [a] : [(Int, a)] xs)