module Rattletrap.Decode.Replication
  ( decodeReplicationsBits
  )
where

import Rattletrap.Decode.Common
import Rattletrap.Decode.CompressedWord
import Rattletrap.Decode.ReplicationValue
import Rattletrap.Type.ClassAttributeMap
import Rattletrap.Type.CompressedWord
import Rattletrap.Type.Replication
import Rattletrap.Type.Word32le

import qualified Control.Monad.Trans.Class as Trans
import qualified Control.Monad.Trans.State as State
import qualified Data.Map as Map

decodeReplicationsBits
  :: (Int, Int, Int)
  -> Word
  -> ClassAttributeMap
  -> State.StateT
       (Map.Map CompressedWord Word32le)
       DecodeBits
       [Replication]
decodeReplicationsBits :: (Int, Int, Int)
-> Word
-> ClassAttributeMap
-> StateT (Map CompressedWord Word32le) DecodeBits [Replication]
decodeReplicationsBits (Int, Int, Int)
version Word
limit ClassAttributeMap
classes = do
  Bool
hasReplication <- BitGet Bool -> StateT (Map CompressedWord Word32le) DecodeBits Bool
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
Trans.lift BitGet Bool
getBool
  if Bool
hasReplication
    then
      (:)
      (Replication -> [Replication] -> [Replication])
-> StateT (Map CompressedWord Word32le) DecodeBits Replication
-> StateT
     (Map CompressedWord Word32le)
     DecodeBits
     ([Replication] -> [Replication])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Int, Int, Int)
-> Word
-> ClassAttributeMap
-> StateT (Map CompressedWord Word32le) DecodeBits Replication
decodeReplicationBits (Int, Int, Int)
version Word
limit ClassAttributeMap
classes
      StateT
  (Map CompressedWord Word32le)
  DecodeBits
  ([Replication] -> [Replication])
-> StateT (Map CompressedWord Word32le) DecodeBits [Replication]
-> StateT (Map CompressedWord Word32le) DecodeBits [Replication]
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Int, Int, Int)
-> Word
-> ClassAttributeMap
-> StateT (Map CompressedWord Word32le) DecodeBits [Replication]
decodeReplicationsBits (Int, Int, Int)
version Word
limit ClassAttributeMap
classes
    else [Replication]
-> StateT (Map CompressedWord Word32le) DecodeBits [Replication]
forall (f :: * -> *) a. Applicative f => a -> f a
pure []

decodeReplicationBits
  :: (Int, Int, Int)
  -> Word
  -> ClassAttributeMap
  -> State.StateT
       (Map.Map CompressedWord Word32le)
       DecodeBits
       Replication
decodeReplicationBits :: (Int, Int, Int)
-> Word
-> ClassAttributeMap
-> StateT (Map CompressedWord Word32le) DecodeBits Replication
decodeReplicationBits (Int, Int, Int)
version Word
limit ClassAttributeMap
classes = do
  CompressedWord
actor <- BitGet CompressedWord
-> StateT (Map CompressedWord Word32le) DecodeBits CompressedWord
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
Trans.lift (Word -> BitGet CompressedWord
decodeCompressedWordBits Word
limit)
  CompressedWord -> ReplicationValue -> Replication
Replication CompressedWord
actor (ReplicationValue -> Replication)
-> StateT (Map CompressedWord Word32le) DecodeBits ReplicationValue
-> StateT (Map CompressedWord Word32le) DecodeBits Replication
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Int, Int, Int)
-> ClassAttributeMap
-> CompressedWord
-> StateT (Map CompressedWord Word32le) DecodeBits ReplicationValue
decodeReplicationValueBits (Int, Int, Int)
version ClassAttributeMap
classes CompressedWord
actor