module Data.Aviation.Stratux.Types.TargetType(
TargetType(..)
, AsTargetType(..)
, AsTargetTypeNum(..)
) where
import Control.Category(Category(id))
import Control.Lens(makeClassyPrisms, Prism', prism', (^?), ( # ))
import Control.Monad(Monad(return), mzero)
import Data.Aeson(FromJSON(parseJSON), ToJSON(toJSON), Value(Number), withScientific)
import Data.Eq(Eq)
import Data.Maybe
import Data.Ord(Ord)
import Data.Scientific(Scientific)
import Prelude(Num, Show)
data TargetType =
ModeS
| Adsb
| Adsr
| TisbS
| Tisb
deriving (Eq, Ord, Show)
makeClassyPrisms ''TargetType
class AsTargetTypeNum a where
_TargetTypeNum ::
(Num a, Eq a) =>
Prism'
a
TargetType
instance AsTargetTypeNum TargetType where
_TargetTypeNum =
id
instance AsTargetTypeNum Scientific where
_TargetTypeNum =
targetTypeNum
targetTypeNum ::
(Num a, Eq a) =>
Prism'
a
TargetType
targetTypeNum =
prism'
(\t -> case t of
ModeS ->
0
Adsb ->
1
Adsr ->
2
TisbS ->
3
Tisb ->
4)
(\n -> case n of
0 ->
Just ModeS
1 ->
Just Adsb
2 ->
Just Adsr
3 ->
Just TisbS
4 ->
Just Tisb
_ ->
Nothing)
instance FromJSON TargetType where
parseJSON =
withScientific "TargetType" (\n -> case n ^? targetTypeNum of
Nothing ->
mzero
Just t ->
return t)
instance ToJSON TargetType where
toJSON c =
Number (targetTypeNum # c)