{-# Language TypeFamilies, FlexibleInstances, FlexibleContexts #-} module Csound.Control.Overload.Outs( Outs(..), onArg ) where import Csound.Typed onArg :: Outs b => (a -> b) -> (a -> SE (SigOuts b)) onArg f = toOuts . f class Sigs (SigOuts a) => Outs a where type SigOuts a :: * toOuts :: a -> SE (SigOuts a) instance Outs Sig where type SigOuts Sig = Sig toOuts = return instance Outs (Sig, Sig) where type SigOuts (Sig, Sig) = (Sig, Sig) toOuts = return instance Outs (Sig, Sig, Sig, Sig) where type SigOuts (Sig, Sig, Sig, Sig) = (Sig, Sig, Sig, Sig) toOuts = return instance Outs (SE Sig) where type SigOuts (SE Sig) = Sig toOuts = id instance Outs (SE (Sig, Sig)) where type SigOuts (SE (Sig, Sig)) = (Sig, Sig) toOuts = id instance Outs (SE (Sig, Sig, Sig, Sig)) where type SigOuts (SE (Sig, Sig, Sig, Sig)) = (Sig, Sig, Sig, Sig) toOuts = id