module Rattletrap.Type.Bitstream
  ( Bitstream(..)
  )
where

import qualified Data.Aeson as Json
import qualified Data.Bool as Bool
import qualified Data.Text as Text

newtype Bitstream = Bitstream
  { bitstreamValue :: [Bool]
  } deriving (Eq, Ord, Show)

instance Json.FromJSON Bitstream where
  parseJSON = Json.withText
    "Bitstream"
    (\text -> Bitstream <$> mapM
      (\char -> case char of
        '0' -> pure False
        '1' -> pure True
        _ -> fail ("invalid bit: " <> show char)
      )
      (Text.unpack text)
    )

instance Json.ToJSON Bitstream where
  toJSON = Json.toJSON . fmap (Bool.bool '0' '1') . bitstreamValue