{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DefaultSignatures #-}
module Data.Aviation.Aip.AipRecord(
AipRecord(..)
, AsAipRecord(..)
, FoldAipRecord(..)
, GetAipRecord(..)
, SetAipRecord(..)
, ManyAipRecord(..)
, HasAipRecord(..)
, IsAipRecord(..)
) where
import Control.Category(id)
import Control.Applicative(pure, (<*>))
import Control.Lens hiding ((.=))
import Data.Aeson(FromJSON(parseJSON), ToJSON(toJSON), withObject, object, (.:), (.=))
import Data.Aviation.Aip.AipDocuments(AipDocuments2)
import Data.Aviation.Aip.Href(Href, SetHref, FoldHref, ManyHref(_ManyHref), FoldHref(_FoldHref))
import Data.Eq(Eq)
import Data.Function(($))
import Data.Functor(fmap, (<$>))
import Data.Time(UTCTime)
import Prelude(Show)
data AipRecord =
AipRecord
UTCTime
Href
AipDocuments2
deriving (Eq, Show)
instance FromJSON AipRecord where
parseJSON =
withObject "AipRecord" $ \v ->
AipRecord <$>
v .: "utc" <*>
v .: "index" <*>
v .: "documents"
instance ToJSON AipRecord where
toJSON (AipRecord t i p) =
object ["utc" .= t, "index" .= i, "documents" .= p]
class ManyAipRecord a => AsAipRecord a where
_AipRecord ::
Prism' a AipRecord
default _AipRecord ::
IsAipRecord a =>
Prism' a AipRecord
_AipRecord =
_IsAipRecord
instance AsAipRecord AipRecord where
_AipRecord =
id
class FoldAipRecord a where
_FoldAipRecord ::
Fold a AipRecord
instance FoldAipRecord AipRecord where
_FoldAipRecord =
id
class FoldAipRecord a => GetAipRecord a where
_GetAipRecord ::
Getter a AipRecord
default _GetAipRecord ::
HasAipRecord a =>
Getter a AipRecord
_GetAipRecord =
aipRecord
instance GetAipRecord AipRecord where
_GetAipRecord =
id
class SetAipRecord a where
_SetAipRecord ::
Setter' a AipRecord
default _SetAipRecord ::
ManyAipRecord a =>
Setter' a AipRecord
_SetAipRecord =
_ManyAipRecord
instance SetAipRecord AipRecord where
_SetAipRecord =
id
class (FoldAipRecord a, SetAipRecord a) => ManyAipRecord a where
_ManyAipRecord ::
Traversal' a AipRecord
instance ManyAipRecord AipRecord where
_ManyAipRecord =
id
class (GetAipRecord a, ManyAipRecord a) => HasAipRecord a where
aipRecord ::
Lens' a AipRecord
default aipRecord ::
IsAipRecord a =>
Lens' a AipRecord
aipRecord =
_IsAipRecord
aipRecordTime ::
Lens' a UTCTime
aipRecordIndex ::
Lens' a Href
aipRecordAipDocuments ::
Lens' a AipDocuments2
instance HasAipRecord AipRecord where
aipRecord =
id
aipRecordTime k (AipRecord t i p) =
fmap (\t' -> AipRecord t' i p) (k t)
aipRecordIndex k (AipRecord t i p) =
fmap (\i' -> AipRecord t i' p) (k i)
aipRecordAipDocuments k (AipRecord t i p) =
fmap (\p' -> AipRecord t i p') (k p)
class (HasAipRecord a, AsAipRecord a) => IsAipRecord a where
_IsAipRecord ::
Iso' a AipRecord
instance IsAipRecord AipRecord where
_IsAipRecord =
id
instance SetAipRecord () where
instance FoldAipRecord () where
_FoldAipRecord =
_ManyAipRecord
instance ManyAipRecord () where
_ManyAipRecord _ x =
pure x
instance SetHref AipRecord where
instance FoldHref AipRecord where
_FoldHref =
_ManyHref
instance ManyHref AipRecord where
_ManyHref f (AipRecord t i p) =
AipRecord <$> pure t <*> _ManyHref f i <*> _ManyHref f p