module Data.Aviation.Stratux.Types.IcaoAddr(
IcaoAddr(..)
, HasIcaoAddr(..)
) where
import Control.Applicative(Applicative((<*>)))
import Control.Lens(makeClassy)
import Control.Monad(Monad(return))
import Data.Aeson(FromJSON(parseJSON), ToJSON(toJSON), Value(Number), withScientific)
import Data.Aviation.Stratux.Types.Word8s(HasWord8s(word8s))
import Data.Bits(shiftR, shiftL, (.|.), (.&.))
import Data.Eq(Eq)
import Data.Functor((<$>))
import Data.Ord(Ord)
import Data.Word(Word8, Word)
import Prelude(floor, fromIntegral, Show, Num((*)))
data IcaoAddr =
IcaoAddr {
_icaoAddrWord0 :: Word8
, _icaoAddrWord1 :: Word8
, _icaoAddrWord2 :: Word8
} deriving (Eq, Ord, Show)
makeClassy ''IcaoAddr
instance FromJSON IcaoAddr where
parseJSON =
withScientific "IcaoAddr" (\i ->
let r :: Word
r = floor i
w n = fromIntegral (shiftR r (n * 8) .&. 255)
in return (IcaoAddr (w 2) (w 1) (w 0)))
instance ToJSON IcaoAddr where
toJSON (IcaoAddr w0 w1 w2) =
Number (fromIntegral (shiftL (shiftL (fromIntegral w0 :: Word) 8 .|. fromIntegral w1) 8 .|. fromIntegral w2))
instance HasWord8s IcaoAddr where
word8s f (IcaoAddr w0 w1 w2) =
IcaoAddr <$> f w0 <*> f w1 <*> f w2