module Utilities.ParseByteString (parseByteString) where

import Control.Applicative ((<$>))
import Data.Word
import Data.Binary.Get
import qualified Data.ByteString.Lazy as BS

data Action m = A1 (m Word8) | A2 (m Word16) | A4 (m Word32)

action 1 = A1 getWord8
action 2 = A2 getWord16be
action 4 = A4 getWord32be
action _ = A1 getWord8


getActionList xs = map action xs

newtype Id a = Id a

getAction :: Action Get -> Get (Action Id)
getAction (A1 act) = A1 . Id <$> act 
getAction (A2 act) = A2 . Id <$> act
getAction (A4 act) = A4 . Id <$> act

getActions :: [Action Get] -> Get [Action Id]
getActions  = mapM getAction

toVal (A1 (Id v)) = fromIntegral v :: Int
toVal (A2 (Id v)) = fromIntegral v :: Int
toVal (A4 (Id v)) = fromIntegral v :: Int

parseByteString :: (Num a) => [a] -> BS.ByteString -> [Int]
parseByteString list byteString = cleanup solution
		where 
			cleanup list1 = map snd . filter ((/= 0) . fst) $ zip list list1
			solution = map toVal $ runGet actionList byteString
			actionList = getActions (getActionList list)
