{-# 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 :: (a -> b) -> a -> SE (SigOuts b)
onArg a -> b
f = b -> SE (SigOuts b)
forall a. Outs a => a -> SE (SigOuts a)
toOuts (b -> SE (SigOuts b)) -> (a -> b) -> a -> SE (SigOuts b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
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 :: Sig -> SE (SigOuts Sig)
toOuts = Sig -> SE (SigOuts Sig)
forall (m :: * -> *) a. Monad m => a -> m a
return

instance Outs (Sig, Sig) where
  type SigOuts (Sig, Sig) = (Sig, Sig)
  toOuts :: (Sig, Sig) -> SE (SigOuts (Sig, Sig))
toOuts = (Sig, Sig) -> SE (SigOuts (Sig, Sig))
forall (m :: * -> *) a. Monad m => a -> m a
return

instance Outs (Sig, Sig, Sig, Sig) where
  type SigOuts (Sig, Sig, Sig, Sig) = (Sig, Sig, Sig, Sig)
  toOuts :: (Sig, Sig, Sig, Sig) -> SE (SigOuts (Sig, Sig, Sig, Sig))
toOuts = (Sig, Sig, Sig, Sig) -> SE (SigOuts (Sig, Sig, Sig, Sig))
forall (m :: * -> *) a. Monad m => a -> m a
return

instance Outs (SE Sig) where
  type SigOuts (SE Sig) = Sig
  toOuts :: SE Sig -> SE (SigOuts (SE Sig))
toOuts = SE Sig -> SE (SigOuts (SE Sig))
forall a. a -> a
id

instance Outs (SE (Sig, Sig)) where
  type SigOuts (SE (Sig, Sig)) = (Sig, Sig)
  toOuts :: SE (Sig, Sig) -> SE (SigOuts (SE (Sig, Sig)))
toOuts = SE (Sig, Sig) -> SE (SigOuts (SE (Sig, Sig)))
forall a. a -> a
id

instance Outs (SE (Sig, Sig, Sig, Sig)) where
  type SigOuts (SE (Sig, Sig, Sig, Sig)) = (Sig, Sig, Sig, Sig)
  toOuts :: SE (Sig, Sig, Sig, Sig) -> SE (SigOuts (SE (Sig, Sig, Sig, Sig)))
toOuts = SE (Sig, Sig, Sig, Sig) -> SE (SigOuts (SE (Sig, Sig, Sig, Sig)))
forall a. a -> a
id