{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RoleAnnotations #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module Servant.GDP
  ( module Servant.GDP.ApiNamedInput,
    module Servant.GDP.ProveInIsolation,
  )
where

import Servant.GDP.ApiNamedInput
import Servant.GDP.ProveInIsolation

import Data.Aeson (ToJSON, toJSON)
import GDP (exorcise, rename, the, type (:::), type (?), type (~~))

instance (ToJSON a) => ToJSON (a ~~ p) where
  toJSON :: (a ~~ p) -> Value
toJSON = a -> Value
forall a. ToJSON a => a -> Value
toJSON (a -> Value) -> ((a ~~ p) -> a) -> (a ~~ p) -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a ~~ p) -> a
forall d a. The d a => d -> a
the

instance (ToJSON a) => ToJSON (a ::: p) where
  toJSON :: (a ::: p) -> Value
toJSON = a -> Value
forall a. ToJSON a => a -> Value
toJSON (a -> Value) -> ((a ::: p) -> a) -> (a ::: p) -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a ::: p) -> a
forall a p. (a ::: p) -> a
exorcise

instance (ToJSON a) => ToJSON (a ? p) where
  toJSON :: (a ? p) -> Value
toJSON a ? p
x =
    (a ? p)
-> (forall name. ((a ~~ name) ::: p name) -> Value) -> Value
forall a (p :: * -> *) t.
(a ? p) -> (forall name. ((a ~~ name) ::: p name) -> t) -> t
rename a ? p
x forall a. ToJSON a => a -> Value
forall name. ((a ~~ name) ::: p name) -> Value
toJSON