yoko-0.9: Data/Yoko/MaybeKind.hs
{-# LANGUAGE TypeFamilies, DataKinds, PolyKinds #-}
{- |
Module : Data.Yoko.MaybeKind
Copyright : (c) The University of Kansas 2012
License : BSD3
Maintainer : nicolas.frisby@gmail.com
Stability : experimental
Portability : see LANGUAGE pragmas (... GHC)
Some interface functions for type-level @Maybe@ (and @Bool@s). These functions
are probably ripe for the @promotion@ library of Eisenberg, Weirich, et alia?
-}
module Data.Yoko.MaybeKind
(-- ** Type-level @Maybe@
IsJust, MaybePlus1, MaybeMap, If
) where
type family If (c :: Bool) (a :: k) (b :: k) :: k
type instance If True a b = a
type instance If False a b = b
-- | Returns a type-level boolean from @type-booleans@.
type family IsJust (x :: Maybe k) :: Bool
type instance IsJust Nothing = False
type instance IsJust (Just x) = True
-- | Type-level @mplus@ for @Maybe@.
type family MaybePlus1 (x :: Maybe k) (y :: Maybe k) :: Maybe k
type instance MaybePlus1 Nothing y = y
type instance MaybePlus1 (Just x) Nothing = Just x
-- | Type-level @fmap@ for @Maybe@.
type family MaybeMap (f :: k -> l) (x :: Maybe k) :: Maybe l
type instance MaybeMap f (Just x) = Just (f x)
type instance MaybeMap f Nothing = Nothing