servant-checked-exceptions-0.1.0.0: src/Servant/Checked/Exceptions/Internal/Util.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{- |
Module : Servant.Checked.Exceptions.Internal.Util
Copyright : Dennis Gosnell 2017
License : BSD3
Maintainer : Dennis Gosnell (cdep.illabout@gmail.com)
Stability : experimental
Portability : unknown
Additional helpers.
-}
module Servant.Checked.Exceptions.Internal.Util where
-- | A type-level @snoc@.
--
-- Append to an empty list:
--
-- >>> Refl :: Snoc '[] Double :~: '[Double]
-- Refl
--
-- Append to a non-empty list:
--
-- >>> Refl :: Snoc '[Char] String :~: '[Char, String]
-- Refl
type family Snoc (as :: [k]) (b :: k) where
Snoc '[] b = '[b]
Snoc (a ': as) b = (a ': Snoc as b)
-- | Change a list of types into a list of functions that take the given type
-- and return @x@.
--
-- >>> Refl :: ReturnX Double '[String, Int] :~: '[String -> Double, Int -> Double]
-- Refl
--
-- Don't do anything with an empty list:
--
-- >>> Refl :: ReturnX Double '[] :~: '[]
-- Refl
type family ReturnX x as where
ReturnX x (a ': as) = ((a -> x) ': ReturnX x as)
ReturnX x '[] = '[]
-- $setup
-- >>> import Data.Type.Equality ((:~:)(Refl))