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