module ID3.Type.Flags
where

import Data.Accessor
import Data.Accessor.Basic (compose)
import Data.Bits
import Data.Word (Word8)
import ID3.Type.Unparse

data Flags = Flags [Bool] deriving (Eq, Show)

emptyFlags   :: Flags
emptyFlags    = Flags $ replicate 8 False

initFlags = flip compose emptyFlags

-- It works as 'initFlags', but changes only specified values
mkFlags ns fs = initFlags $ zipWith access ns fs
    where access n f = (accessFlag n) ^= f

allFlags    :: Accessor Flags [Bool]
allFlags     = accessor (\(Flags fs) -> fs) (\x _ -> Flags x)

accessFlag  :: Int -> Accessor Flags Bool
accessFlag n = accessor (\(Flags fs) -> fs!!(n-1)) (\x (Flags fs) -> Flags $ (take (n-1) fs)++[x]++(drop n fs))

instance Parsed Flags where
    unparse fs = [foldr fromBool 0 (zip [0..] (fs^.allFlags))]
        where fromBool (i, True)  = flip setBit   i
              fromBool (i, False) = flip clearBit i