{-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE DefaultSignatures #-} module Data.Aviation.Aip.DAPDoc( DAPDoc(..) , AsDAPDoc(..) , FoldDAPDoc(..) , GetDAPDoc(..) , SetDAPDoc(..) , ManyDAPDoc(..) , HasDAPDoc(..) , IsDAPDoc(..) ) 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.DAPType(DAPType) import Data.Aviation.Aip.DAPEntries(DAPEntries, FoldDAPEntries(_FoldDAPEntries), GetDAPEntries, SetDAPEntries, ManyDAPEntries(_ManyDAPEntries), HasDAPEntries(dapEntries)) 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.Ord(Ord) import Data.String(String) import Prelude(Show) data DAPDoc = DAPDoc (DAPType String) Href DAPEntries deriving (Eq, Ord, Show) instance FromJSON DAPDoc where parseJSON = withObject "DAPDoc" $ \v -> DAPDoc <$> v .: "type" <*> v .: "href" <*> v .: "entries" instance ToJSON DAPDoc where toJSON (DAPDoc typ u entries) = object ["type" .= typ, "href" .= u, "entries" .= entries] class ManyDAPDoc a => AsDAPDoc a where _DAPDoc :: Prism' a DAPDoc default _DAPDoc :: IsDAPDoc a => Prism' a DAPDoc _DAPDoc = _IsDAPDoc instance AsDAPDoc DAPDoc where _DAPDoc = id class FoldDAPDoc a where _FoldDAPDoc :: Fold a DAPDoc instance FoldDAPDoc DAPDoc where _FoldDAPDoc = id class FoldDAPDoc a => GetDAPDoc a where _GetDAPDoc :: Getter a DAPDoc default _GetDAPDoc :: HasDAPDoc a => Getter a DAPDoc _GetDAPDoc = dapDoc instance GetDAPDoc DAPDoc where _GetDAPDoc = id class SetDAPDoc a where _SetDAPDoc :: Setter' a DAPDoc default _SetDAPDoc :: ManyDAPDoc a => Setter' a DAPDoc _SetDAPDoc = _ManyDAPDoc instance SetDAPDoc DAPDoc where _SetDAPDoc = id class (FoldDAPDoc a, SetDAPDoc a) => ManyDAPDoc a where _ManyDAPDoc :: Traversal' a DAPDoc instance ManyDAPDoc DAPDoc where _ManyDAPDoc = id class (GetDAPDoc a, ManyDAPDoc a) => HasDAPDoc a where dapDoc :: Lens' a DAPDoc default dapDoc :: IsDAPDoc a => Lens' a DAPDoc dapDoc = _IsDAPDoc instance HasDAPDoc DAPDoc where dapDoc = id class (HasDAPDoc a, AsDAPDoc a) => IsDAPDoc a where _IsDAPDoc :: Iso' a DAPDoc instance IsDAPDoc DAPDoc where _IsDAPDoc = id instance SetDAPDoc () where instance FoldDAPDoc () where _FoldDAPDoc = _ManyDAPDoc instance ManyDAPDoc () where _ManyDAPDoc _ x = pure x instance SetHref DAPDoc where instance FoldHref DAPDoc where _FoldHref = _ManyHref instance ManyHref DAPDoc where _ManyHref f (DAPDoc typ u entries) = DAPDoc <$> pure typ <*> f u <*> _ManyHref f entries ---- instance FoldDAPEntries DAPDoc where _FoldDAPEntries = dapEntries instance GetDAPEntries DAPDoc where instance SetDAPEntries DAPDoc where instance ManyDAPEntries DAPDoc where _ManyDAPEntries = dapEntries instance HasDAPEntries DAPDoc where dapEntries k (DAPDoc typ u entries) = fmap (\entries' -> DAPDoc typ u entries') (k entries)