packages feed

csound-expression-1.0.0: src/Csound/Tfm/TfmTree.hs

module Csound.Tfm.TfmTree(
    TabMap, tabMap, substTabs
) where

import Data.List(nub)
import Data.Fix
import qualified Data.Map as M
import Data.Foldable(foldMap)

import Csound.Exp

type TabMap = M.Map Tab Int

-- substitute ftables for ids 

substTabs :: TabMap -> E -> E
substTabs m = cata $ \(RatedExp r d x) -> Fix $ RatedExp r d $ case x of
    ExpPrim (PrimTab t) -> ExpPrim (PrimInt $ m M.! t)
    _ -> x


tabMap :: [E] -> TabMap
tabMap es = M.fromList $ zip (nub $ getFtables =<< es) [1 ..]

getFtables :: E -> [Tab]
getFtables = cata $ \(RatedExp _ _ x) -> case x of
    ExpPrim (PrimTab t) -> [t]
    ExpPrim _ -> []
    Tfm _ as -> concat as
    ConvertRate _ _ a -> a
    ExpNum a -> foldMap id a
    Select _ _ a -> a
    If info a b -> foldMap id info ++ a ++ b
    ReadVar _ -> []
    WriteVar _ a -> a