packages feed

type-machine-0.1.0.0: src/TypeMachine/Infix.hs

module TypeMachine.Infix (
    -- * Intersection
    (<#|>),
    (<:#|>),
    (<#|:>),

    -- ** Flipped Intersection
    (<|#>),
    (<:|#>),
    (<|#:>),

    -- * Union
    (<#&>),
    (<:#&>),
    (<#&:>),

    -- ** Flipped Union
    (<&#>),
    (<:&#>),
    (<&#:>),
) where

import Language.Haskell.TH (Name)
import TypeMachine.Functions
import TypeMachine.TM
import TypeMachine.Type

-- | Alias to 'intersection'
(<#|>) :: Type -> Type -> TM Type
(<#|>) = intersection
{-# INLINE (<#|>) #-}

-- | Like '<#|>', but the first parameter is a name
(<:#|>) :: Name -> Type -> TM Type
a <:#|> b = toType a >>= \a' -> a' <#|> b

-- | Like '<#|>', but the second parameter is a name
(<#|:>) :: Type -> Name -> TM Type
a <#|:> b = toType b >>= \b' -> a <#|> b'

-- | Alias to 'intersection''
(<|#>) :: Type -> Type -> TM Type
(<|#>) = intersection'
{-# INLINE (<|#>) #-}

-- | Like '<|#>', but the first parameter is a name
(<:|#>) :: Name -> Type -> TM Type
a <:|#> b = toType a >>= \a' -> a' <|#> b

-- | Like '<|#>', but the second parameter is a name
(<|#:>) :: Type -> Name -> TM Type
a <|#:> b = toType b >>= \b' -> a <|#> b'

-- | Alias to 'union'
(<#&>) :: Type -> Type -> TM Type
(<#&>) = union
{-# INLINE (<#&>) #-}

-- | Like '<#&>', but the first parameter is a name
(<:#&>) :: Name -> Type -> TM Type
a <:#&> b = toType a >>= \a' -> a' <#&> b

-- | Like '<#&>', but the second parameter is a name
(<#&:>) :: Type -> Name -> TM Type
a <#&:> b = toType b >>= \b' -> a <#&> b'

-- | Alias to 'union''
(<&#>) :: Type -> Type -> TM Type
(<&#>) = union'
{-# INLINE (<&#>) #-}

-- | Like '<&#>', but the first parameter is a name
(<:&#>) :: Name -> Type -> TM Type
a <:&#> b = toType a >>= \a' -> a' <&#> b

-- | Like '<&#>', but the second parameter is a name
(<&#:>) :: Type -> Name -> TM Type
a <&#:> b = toType b >>= \b' -> a <&#> b'