{-# LANGUAGE TypeFamilies, MultiParamTypeClasses #-}

module Language.XDsp.Semantics.Core

where

-- |Third version of tagless final csound interpreter
-- no de Bruijn indices, a monadic repr

class Dsp repr where
  data ASig repr :: *
  data KSig repr :: *
  data INum repr :: *
  getSr    :: repr Integer
  getKsmps :: repr Integer

-- |Create signals from constants.
class Dsp repr => Constants repr where
  cnst :: Double -> repr (INum repr)
  ckig :: Double -> repr (KSig repr)
  csig :: Double -> repr (ASig repr)

-- | Named variables in a backend.
class Var a where
  type VarRep a :: *
  getVarRep :: a -> VarRep a

-- ---------------------------------
-- ---------------------------------
-- Very common extensions.

-- | Assign a signal to a named variable
class Dsp repr => Asn repr a where
  asn   :: a -> repr a

class Dsp repr => Cast repr where
  ik :: INum repr -> repr (KSig repr)
  ia :: INum repr -> repr (ASig repr)
  ki :: KSig repr -> repr (INum repr)