variadic-0.0.0.0: Abstractions for working with variadic functions
Safe HaskellNone
LanguageHaskell2010

Control.Variadic

Synopsis

Documentation

newtype VariadicT args (m :: * -> *) a Source #

Same as Variadic but captures the higher-kinded type parameter in the return type. Useful so we can use Monad and friends with Variadic functions.

Constructors

VariadicT 

Fields

Instances

Instances details
MMonad (VariadicT args) Source # 
Instance details

Defined in Control.Variadic

Methods

embed :: forall (n :: Type -> Type) m b. Monad n => (forall a. m a -> VariadicT args n a) -> VariadicT args m b -> VariadicT args n b #

MonadTrans (VariadicT args) Source # 
Instance details

Defined in Control.Variadic

Methods

lift :: Monad m => m a -> VariadicT args m a #

MFunctor (VariadicT args :: (Type -> Type) -> Type -> Type) Source # 
Instance details

Defined in Control.Variadic

Methods

hoist :: forall m n (b :: k). Monad m => (forall a. m a -> n a) -> VariadicT args m b -> VariadicT args n b #

Monad m => Monad (VariadicT args m) Source # 
Instance details

Defined in Control.Variadic

Methods

(>>=) :: VariadicT args m a -> (a -> VariadicT args m b) -> VariadicT args m b #

(>>) :: VariadicT args m a -> VariadicT args m b -> VariadicT args m b #

return :: a -> VariadicT args m a #

Functor m => Functor (VariadicT args m) Source # 
Instance details

Defined in Control.Variadic

Methods

fmap :: (a -> b) -> VariadicT args m a -> VariadicT args m b #

(<$) :: a -> VariadicT args m b -> VariadicT args m a #

Applicative m => Applicative (VariadicT args m) Source # 
Instance details

Defined in Control.Variadic

Methods

pure :: a -> VariadicT args m a #

(<*>) :: VariadicT args m (a -> b) -> VariadicT args m a -> VariadicT args m b #

liftA2 :: (a -> b -> c) -> VariadicT args m a -> VariadicT args m b -> VariadicT args m c #

(*>) :: VariadicT args m a -> VariadicT args m b -> VariadicT args m b #

(<*) :: VariadicT args m a -> VariadicT args m b -> VariadicT args m a #

toVariadicT :: (ToVariadic x, args ~ ToVariadicArgs x, m r ~ ToVariadicReturn x) => x -> VariadicT args m r Source #

Converts a function to a VariadicT. Analogous to toVariadic.

fromVariadicT :: FromVariadic args (m r) => VariadicT args m r -> FromVariadicSignature args (m r) Source #

Converts a VariadicT to a normal function. Analogous to fromVariadic.

newtype Variadic args a Source #

A function whose argument list is collapsed into Varargs and shows its return type.

Constructors

Variadic 

Fields

type family ToVariadicArgs x :: [*] where ... Source #

Resolves the argument list for a function of arbitrary arity.

Equations

ToVariadicArgs (i -> o) = i ': ToVariadicArgs o 
ToVariadicArgs a = '[] 

type family ToVariadicReturn x :: * where ... Source #

Resolves the return type for a function of arbitrary arity.

Equations

ToVariadicReturn (i -> o) = ToVariadicReturn o 
ToVariadicReturn a = a 

class ToVariadic x where Source #

Converts a function of arbitrary arity to Variadic.

Instances

Instances details
(ToVariadicArgs a ~ ('[] :: [Type]), ToVariadicReturn a ~ a) => ToVariadic a Source # 
Instance details

Defined in Control.Variadic

(ToVariadic o, ToVariadicArgs (i -> o) ~ (i ': args), ToVariadicArgs o ~ args, ToVariadicReturn (i -> o) ~ ToVariadicReturn o) => ToVariadic (i -> o) Source # 
Instance details

Defined in Control.Variadic

Methods

toVariadic :: (i -> o) -> Variadic (ToVariadicArgs (i -> o)) (ToVariadicReturn (i -> o)) Source #

type family FromVariadicSignature (args :: [*]) (r :: *) :: * where ... Source #

Builds a function signature given the args and return type r.

Equations

FromVariadicSignature '[] r = r 
FromVariadicSignature (arg ': args) r = arg -> FromVariadicSignature args r 

class FromVariadic args r where Source #

Converts a Variadic to a normal function.

Instances

Instances details
FromVariadic ('[] :: [Type]) a Source # 
Instance details

Defined in Control.Variadic

FromVariadic args a => FromVariadic (arg ': args) a Source # 
Instance details

Defined in Control.Variadic

Methods

fromVariadic :: Variadic (arg ': args) a -> FromVariadicSignature (arg ': args) a Source #

type IsVariadic x args r = (ToVariadic x, args ~ ToVariadicArgs x, r ~ ToVariadicReturn x, x ~ FromVariadicSignature args r, FromVariadic args r) Source #

Convenience constraint enabling variadic.

x is the Haskell function type, args is a type-level list of arguments, r is the return type.

Usually you'll want to use these type arguments polymorphically, e.g. -

(...*>)
  :: ( Applicative m
     , IsVariadic va args (m a)
     , IsVariadic vb args (m b)
     )
  => va -> vb -> vb
va ...*> vb = fromVariadicT $ toVariadicT va *> toVariadicT vb

vmap :: (Functor f, IsVariadic va args (f a), IsVariadic vb args (f b)) => (a -> b) -> va -> vb Source #

Analogous to fmap for VariadicT but works on vanilla functions.

(<$>...) :: (Functor f, IsVariadic va args (f a), IsVariadic vb args (f b)) => (a -> b) -> va -> vb Source #

Analogous to fmap for VariadicT but works on vanilla functions.

vvoid :: (Functor f, IsVariadic va args (f a), IsVariadic vu args (f ())) => va -> vu Source #

Analogous to void for VariadicT but works on vanilla functions.

(...*>) :: (Applicative m, IsVariadic va args (m a), IsVariadic vb args (m b)) => va -> vb -> vb Source #

Analogous to *> for VariadicT but works on vanilla functions.

(<*...) :: (Applicative m, IsVariadic va args (m a), IsVariadic vb args (m b)) => va -> vb -> va Source #

Analogous to <* for VariadicT but works on vanilla functions.

(...>>=) :: (Monad m, IsVariadic va args (m a), IsVariadic vb args (m b)) => va -> (a -> vb) -> vb Source #

Analogous to >>= for VariadicT but works on vanilla functions.

(=<<...) :: (Monad m, IsVariadic va args (m a), IsVariadic vb args (m b)) => (a -> vb) -> va -> vb Source #

Analogous to =<< for VariadicT but works on vanilla functions.

vhoist :: (Monad f, IsVariadic vf args (f a), IsVariadic vg args (g a)) => (forall x. f x -> g x) -> vf -> vg Source #

Analogous to hoist for VariadicT but works on vanilla functions.