module Data.Aviation.Stratux.Types.EmitterCategory(
EmitterCategory(..)
, AsEmitterCategory(..)
, AsEmitterCategoryNum(..)
) where
import Control.Category(Category(id))
import Control.Lens(Prism', prism', makeClassyPrisms, (^?), ( # ))
import Control.Monad(mzero, Monad(return))
import Data.Aeson(FromJSON(parseJSON), ToJSON(toJSON), Value(Number), withScientific)
import Data.Eq(Eq)
import Data.Maybe(Maybe(Just, Nothing))
import Data.Ord(Ord)
import Data.Scientific(Scientific)
import Prelude(Show, Num)
data EmitterCategory =
NoEmitterCategory
| Light
| Small
| Large
| HighVortexLarge
| Heavy
| HighPerformance
| Rotorcraft
deriving (Eq, Ord, Show)
makeClassyPrisms ''EmitterCategory
class AsEmitterCategoryNum a where
_EmitterCategoryNum ::
(Num a, Eq a) =>
Prism'
a
EmitterCategory
instance AsEmitterCategoryNum EmitterCategory where
_EmitterCategoryNum =
id
instance AsEmitterCategoryNum Scientific where
_EmitterCategoryNum =
emitterCategoryNum
emitterCategoryNum ::
(Num a, Eq a) =>
Prism'
a
EmitterCategory
emitterCategoryNum =
prism'
(\t -> case t of
NoEmitterCategory ->
0
Light ->
1
Small ->
2
Large ->
3
HighVortexLarge ->
4
Heavy ->
5
HighPerformance ->
6
Rotorcraft ->
7)
(\n -> case n of
0 ->
Just NoEmitterCategory
1 ->
Just Light
2 ->
Just Small
3 ->
Just Large
4 ->
Just HighVortexLarge
5 ->
Just Heavy
6 ->
Just HighPerformance
7 ->
Just Rotorcraft
_ ->
Nothing)
instance FromJSON EmitterCategory where
parseJSON =
withScientific "EmitterCategory" (\n -> case n ^? _EmitterCategoryNum of
Nothing ->
mzero
Just t ->
return t)
instance ToJSON EmitterCategory where
toJSON c =
Number (_EmitterCategoryNum # c)