module Csound.Typed.Plugins.TabQueue(
    tabQueue2_append, tabQueue2_delete, tabQueue2_hasElements, tabQueue2_readLastElement
) where

import Data.Boolean
import Control.Monad.Trans.Class
import Control.Applicative

import Csound.Dynamic

import Csound.Typed.Types
import Csound.Typed.GlobalState
import qualified Csound.Typed.GlobalState.Elements as E(tabQueue2Plugin)

-------------------------------------------------------------------------------
-- table queue for midi notes

-- |
-- > tabQueue2_append table (pch, vol)
tabQueue2_append :: Tab -> (D, D) -> SE ()
tabQueue2_append tab (pch, vol) = SE $ (depT_ =<<) $ lift $ do
    addUdoPlugin E.tabQueue2Plugin
    f <$> toGE tab <*> toGE pch <*> toGE vol
    where f tab pch vol = opcs "TabQueue2_Append" [(Xr, [Ir, Ir, Ir])] [tab, pch, vol]

-- | Delete by pitch
--
-- > tabQueue2_delete table pch
tabQueue2_delete :: Tab -> D -> SE ()
tabQueue2_delete tab pch = SE $ (depT_ =<<) $ lift $ do
    addUdoPlugin E.tabQueue2Plugin
    f <$> toGE tab <*> toGE pch
    where f tab pch = opcs "TabQueue2_Delete" [(Xr, [Ir, Ir])] [tab, pch]

-- | Queue is not empty
tabQueue2_hasElements :: Tab -> BoolSig
tabQueue2_hasElements = (==* 1) . tabQueue2_hasElements'

tabQueue2_hasElements' :: Tab -> Sig
tabQueue2_hasElements' tab = fromGE $ do
    addUdoPlugin E.tabQueue2Plugin
    f <$> toGE tab
    where f tab = opcs "TabQueue2_HasElements" [(Kr, [Ir])] [tab]

tabQueue2_readLastElement :: Tab -> (Sig, Sig)
tabQueue2_readLastElement tab = toTuple $ fmap ($ 2) $ do
    addUdoPlugin E.tabQueue2Plugin
    f <$> toGE tab
    where f tab = mopcs "TabQueue2_ReadLastElement" ([Kr, Kr], [Ir]) [tab]