{-# LANGUAGE UndecidableInstances #-}
module Servant.Hateoas.Layer
(
MkLayers,
module Servant.Hateoas.Layer.Type,
module Servant.Hateoas.Layer.Build,
module Servant.Hateoas.Layer.Merge,
GoLayers,
Normalize,
)
where
import Servant
import Servant.Hateoas.Layer.Type
import Servant.Hateoas.Layer.Merge
import Servant.Hateoas.Layer.Build
import Servant.Hateoas.Internal.Sym
import Data.Kind
type MkLayers :: p -> [Layer]
type family MkLayers api where
MkLayers api = MergeLayers (GoLayers (Normalize (Symify api)) '[]) '[]
type family Normalize api where
Normalize ((prefix :> a) :<|> (prefix :> b)) = Normalize (prefix :> (Normalize a :<|> Normalize b))
Normalize (a :<|> b) = Normalize a :<|> Normalize b
Normalize ((prefix :> a) :> (prefix :> b)) = Normalize (prefix :> (Normalize a :> Normalize b))
Normalize (a :> b) = a :> Normalize b
Normalize a = a
type GoLayers :: p -> [Type] -> [Layer]
type family GoLayers api stand where
GoLayers (a :<|> b) prefix = GoLayers a prefix ++ GoLayers b prefix
GoLayers (Sym a :> b) prefix = '[ 'Layer prefix '[Sym a] GetIntermediate ] ++ GoLayers b (prefix ++ '[Sym a])
GoLayers (Capture' mods sym a :> b) prefix = '[ 'Layer prefix '[Capture' mods sym a] GetIntermediate ] ++ GoLayers b (prefix ++ '[Capture' mods sym a])
GoLayers (CaptureAll sym a :> b) prefix = '[ 'Layer prefix '[CaptureAll sym a] GetIntermediate ] ++ GoLayers b (prefix ++ '[CaptureAll sym a])
GoLayers (QueryParam' mods sym a :> b) prefix = '[ 'Layer prefix '[QueryParam' mods sym a] GetIntermediate ] ++ GoLayers b prefix
GoLayers (QueryParams sym a :> b) prefix = '[ 'Layer prefix '[QueryParams sym a] GetIntermediate ] ++ GoLayers b prefix
GoLayers (DeepQuery sym a :> b) prefix = '[ 'Layer prefix '[DeepQuery sym a] GetIntermediate ] ++ GoLayers b prefix
GoLayers (QueryFlag sym :> b) prefix = '[ 'Layer prefix '[QueryFlag sym ] GetIntermediate ] ++ GoLayers b prefix
GoLayers (a :> b) prefix = GoLayers b (prefix ++ '[a])
GoLayers _ _ = '[]