Copyright | (c) 2018-2020 Kowainik |
---|---|

License | MIT |

Maintainer | Kowainik <xrom.xkov@gmail.com> |

Stability | Experimental |

Portability | Portable |

Safe Haskell | Safe |

Language | Haskell2010 |

Contains useful utilities to work with Types.

*Since: 0.4.0*

## Synopsis

- typeName :: forall a. Typeable a => Text
- type family (xs :: [k]) ++ (ys :: [k]) :: [k] where ...
- type family AllHave (f :: k -> Constraint) (xs :: [k]) :: Constraint where ...
- type family Elem (e :: t) (es :: [t]) :: Bool where ...
- type family Fst (t :: k) :: k' where ...
- type family Snd (t :: k) :: k' where ...

# Documentation

typeName :: forall a. Typeable a => Text Source #

Gets a string representation of a type.

**NOTE:** This must be used with **TypeApplications** language extension.

`>>>`

"()"`typeName @()`

`>>>`

"Int"`typeName @Int`

`>>>`

"[Char]"`typeName @String`

`>>>`

"Maybe Int"`typeName @(Maybe Int)`

*Since: 0.4.0*

type family (xs :: [k]) ++ (ys :: [k]) :: [k] where ... infixr 5 Source #

Concatenates type-level lists.

`>>>`

'[ 'Just 5, 'Nothing] ++ '[ 'Just 3, 'Nothing, 'Just 1] :: [Maybe Nat] = '[ 'Just 5, 'Nothing, 'Just 3, 'Nothing, 'Just 1]`:kind! '[ 'Just 5, 'Nothing] ++ '[ 'Just 3, 'Nothing, 'Just 1]`

`>>>`

'[] ++ '[ 'Just 3, 'Nothing, 'Just 1] :: [Maybe Nat] = '[ 'Just 3, 'Nothing, 'Just 1]`:kind! '[] ++ '[ 'Just 3, 'Nothing, 'Just 1]`

*Since: 0.6.0.0*

type family AllHave (f :: k -> Constraint) (xs :: [k]) :: Constraint where ... Source #

Builds combined `Constraint`

by applying Constraint constructor to all
elements of type-level list.

`>>>`

AllHave Show '[Int, Text, Double] :: Constraint = (Show Int, (Show Text, (Show Double, () :: Constraint)))`:kind! AllHave Show '[Int, Text, Double]`

which is equivalent to:

(Show Int, Show Text, Show Double) :: Constraint

*Since: 0.6.0.0*

type family Elem (e :: t) (es :: [t]) :: Bool where ... Source #

Check that a type is an element of a list:

`>>>`

Elem String '[] :: Bool = 'False`:kind! Elem String '[]`

`>>>`

Elem String '[Int, String] :: Bool = 'True`:kind! Elem String '[Int, String]`

`>>>`

Elem String '[Int, Bool] :: Bool = 'False`:kind! Elem String '[Int, Bool]`

*Since: 0.6.0.0*

type family Fst (t :: k) :: k' where ... Source #

Returns first element of tuple type (with kind `*`

) or type-level tuple
(with kind `(k1, k2)`

, marked by prefix quote).

`>>>`

Maybe (Fst '(Int, Text)) :: * = Maybe Int`:kind! Maybe (Fst '(Int, Text))`

`>>>`

Maybe (Fst (Int, Text)) :: * = Maybe Int`:kind! Maybe (Fst (Int, Text))`

*Since: 0.6.0.0*

type family Snd (t :: k) :: k' where ... Source #

Returns second element of tuple type (with kind `*`

) or type-level tuple
(with kind `(k1, k2)`

, marked by prefix quote).

`>>>`

Maybe (Snd '(Int, Text)) :: * = Maybe Text`:kind! Maybe (Snd '(Int, Text))`

`>>>`

Maybe (Snd (Int, Text)) :: * = Maybe Text`:kind! Maybe (Snd (Int, Text))`

*Since: 0.6.0.0*