mensam-0
Safe HaskellSafe-Inferred
LanguageGHC2021

Mensam.API.Aeson.StaticText.Internal.Union

Description

This module is heavily inspired by servant's Servant.Api.Uverb.Union.

Synopsis

Documentation

type Union = NS I Source #

Stuff stolen from 'Data.WorldPeace" but for generics-sop

type IsMember (a :: u) (as :: [u]) = (Unique as, CheckElemIsMember a as, UElem a as) Source #

class UElem x xs where Source #

Methods

inject :: f x -> NS f xs Source #

eject :: NS f xs -> Maybe (f x) Source #

Instances

Instances details
UElem (x :: a) (x ': xs :: [a]) Source # 
Instance details

Defined in Mensam.API.Aeson.StaticText.Internal.Union

Methods

inject :: f x -> NS f (x ': xs) Source #

eject :: NS f (x ': xs) -> Maybe (f x) Source #

UElem x xs => UElem (x :: a) (x' ': xs :: [a]) Source # 
Instance details

Defined in Mensam.API.Aeson.StaticText.Internal.Union

Methods

inject :: f x -> NS f (x' ': xs) Source #

eject :: NS f (x' ': xs) -> Maybe (f x) Source #

type family CheckElemIsMember (a :: k) (as :: [k]) :: Constraint where ... Source #

Check whether a is in given type-level list. This will throw a nice error if the element is not in the list.

Equations

CheckElemIsMember a as = If (Elem a as) (() :: Constraint) (TypeError (NoElementError a as)) 

type NoElementError (r :: k) (rs :: [k]) = (('Text "Expected one of:" ':$$: ('Text " " ':<>: 'ShowType rs)) ':$$: 'Text "But got:") ':$$: ('Text " " ':<>: 'ShowType r) Source #

type DuplicateElementError (rs :: [k]) = 'Text "Duplicate element in list:" ':$$: ('Text " " ':<>: 'ShowType rs) Source #

type family Elem (x :: k) (xs :: [k]) :: Bool where ... Source #

Equations

Elem x (x ': _) = 'True 
Elem x (_ ': xs) = Elem x xs 
Elem _ '[] = 'False 

type family Unique xs :: Constraint where ... Source #

Check whether all values in a type-level list are distinct. This will throw a nice error if there are any duplicate elements in the list.

Equations

Unique xs = If (Nubbed xs == 'True) (() :: Constraint) (TypeError (DuplicateElementError xs)) 

type family Nubbed xs :: Bool where ... Source #

Equations

Nubbed '[] = 'True 
Nubbed (x ': xs) = If (Elem x xs) 'False (Nubbed xs) 

type family Map f xs where ... Source #

Equations

Map _ '[] = '[] 
Map f (x : xs) = f x : Map f xs