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