csound-expression-dynamic 0.1.2 → 0.1.3
raw patch · 6 files changed
+43/−22 lines, 6 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Csound.Dynamic.Build.Logic: elseIfBegin :: Monad m => E -> DepT m ()
- Csound.Dynamic.Types.Exp: ElseIfBegin :: (CondInfo a) -> MainExp a
+ Csound.Dynamic.Types.Exp: toPrimOrTfm :: Rate -> E -> PrimOr E
Files
- csound-expression-dynamic.cabal +1/−1
- src/Csound/Dynamic/Build.hs +19/−8
- src/Csound/Dynamic/Build/Logic.hs +3/−6
- src/Csound/Dynamic/Render/Instr.hs +2/−2
- src/Csound/Dynamic/Render/Pretty.hs +1/−1
- src/Csound/Dynamic/Types/Exp.hs +17/−4
csound-expression-dynamic.cabal view
@@ -1,5 +1,5 @@ Name: csound-expression-dynamic-Version: 0.1.2+Version: 0.1.3 Cabal-Version: >= 1.6 License: BSD3 License-file: LICENSE
src/Csound/Dynamic/Build.hs view
@@ -23,8 +23,9 @@ setSr, setKsmps, setNchnls, setNchnls_i, setKr, setZeroDbfs ) where -import qualified Data.Map as M(fromList)+import qualified Data.Map as M(fromList, toList) +import Data.List(transpose) import Data.Fix(Fix(..)) import Csound.Dynamic.Types@@ -45,8 +46,15 @@ oprInfix name signature = Info name signature Infix tfm :: Info -> [E] -> E-tfm info args = noRate $ Tfm info $ fmap toPrimOr args+tfm info args = noRate $ Tfm info $ zipWith toPrimOrTfm (getInfoRates info) args +getInfoRates :: Info -> [Rate]+getInfoRates a = getInRates $ infoSignature a+ where+ getInRates x = case x of+ SingleRate m -> fmap minimum $ transpose $ fmap snd $ M.toList m+ MultiRate _ ins -> ins+ tfmNoInlineArgs :: Info -> [E] -> E tfmNoInlineArgs info args = noRate $ Tfm info $ fmap (PrimOr . Right) args @@ -177,12 +185,15 @@ setZeroDbfs :: Monad m => Double -> DepT m () -setSr = gInit "sr"-setKr = gInit "kr"-setNchnls = gInit "nchnls"-setNchnls_i = gInit "nchnls_i"-setKsmps = gInit "ksmps"-setZeroDbfs = gInitDouble "0dbfs"+setGlobal :: (Monad m, Show a) => String -> a -> DepT m ()+setGlobal name val = verbatim $ name ++ " = " ++ show val++setSr = setGlobal "sr"+setKr = setGlobal "kr"+setNchnls = setGlobal "nchnls"+setNchnls_i = setGlobal "nchnls_i"+setKsmps = setGlobal "ksmps"+setZeroDbfs = setGlobal "0dbfs" gInit :: Monad m => String -> Int -> DepT m () gInit name val = writeVar (VarVerbatim Ir name) (int val)
src/Csound/Dynamic/Build/Logic.hs view
@@ -3,7 +3,7 @@ -- | Boolean instances module Csound.Dynamic.Build.Logic( when1, whens,- ifBegin, ifEnd, elseBegin, elseIfBegin,+ ifBegin, ifEnd, elseBegin, untilDo, untilBegin, untilEnd ) where@@ -33,14 +33,11 @@ elseIfs as elseBegin el- ifEnd- where elseIfs = mapM_ (\(p, body) -> elseIfBegin p >> body)+ foldl1 (>>) $ replicate (1 + length as) ifEnd+ where elseIfs = mapM_ (\(p, body) -> elseBegin >> ifBegin p >> body) ifBegin :: Monad m => E -> DepT m () ifBegin = withCond IfBegin--elseIfBegin :: Monad m => E -> DepT m ()-elseIfBegin = withCond ElseIfBegin elseBegin :: Monad m => DepT m () elseBegin = stmtOnlyT ElseBegin
src/Csound/Dynamic/Render/Instr.hs view
@@ -44,7 +44,7 @@ getFrameInfo x = case ratedExpExp x of -- Imperative If-then-else IfBegin _ -> StartFrame- ElseIfBegin _ -> NextFrame+-- ElseIfBegin _ -> NextFrame ElseBegin -> NextFrame IfEnd -> StopFrame -- looping constructions@@ -169,7 +169,7 @@ ExpPrim p -> ExpPrim p IfBegin _ -> rec2 condRate expr UntilBegin _ -> rec2 condRate expr- ElseIfBegin _ -> rec2 condRate expr+-- ElseIfBegin _ -> rec2 condRate expr ElseBegin -> ElseBegin IfEnd -> IfEnd UntilEnd -> UntilEnd
src/Csound/Dynamic/Render/Pretty.hs view
@@ -116,7 +116,7 @@ ReadVar v -> tab $ res $= ppVar v IfBegin a -> succTab $ text "if " <> ppCond a <> text " then"- ElseIfBegin a -> left >> (succTab $ text "elseif " <> ppCond a <> text " then") +-- ElseIfBegin a -> left >> (succTab $ text "elseif " <> ppCond a <> text " then") ElseBegin -> left >> (succTab $ text "else") IfEnd -> left >> (tab $ text "endif") UntilBegin a -> succTab $ text "until " <> ppCond a <> text " do"
src/Csound/Dynamic/Types/Exp.hs view
@@ -3,7 +3,7 @@ module Csound.Dynamic.Types.Exp( E, RatedExp(..), isEmptyExp, RatedVar, ratedVar, ratedVarRate, ratedVarId, ratedExp, noRate, withRate, setRate,- Exp, toPrimOr, PrimOr(..), MainExp(..), Name, + Exp, toPrimOr, toPrimOrTfm, PrimOr(..), MainExp(..), Name, InstrId(..), intInstrId, ratioInstrId, stringInstrId, VarType(..), Var(..), Info(..), OpcFixity(..), Rate(..), Signature(..), isInfix, isPrefix, @@ -102,11 +102,24 @@ toPrimOr :: E -> PrimOr E toPrimOr a = PrimOr $ case ratedExpExp $ unFix a of ExpPrim (PString _) -> Right a- ExpPrim p -> Left p+ ExpPrim p -> Left p ReadVar v | noDeps -> Left (PrimVar (varRate v) v) _ -> Right a- where noDeps = isNothing $ ratedExpDepends $ unFix a+ where + noDeps = isNothing $ ratedExpDepends $ unFix a +-- | Constructs PrimOr values from the expressions. It does inlining in+-- case of primitive values.+toPrimOrTfm :: Rate -> E -> PrimOr E+toPrimOrTfm r a = PrimOr $ case ratedExpExp $ unFix a of+ ExpPrim (PString _) -> Right a+ ExpPrim p | (r == Ir || r == Sr) -> Left p+ ReadVar v | noDeps -> Left (PrimVar (varRate v) v)+ _ -> Right a+ where + noDeps = isNothing $ ratedExpDepends $ unFix a++ -- Expressions with inlining. type Exp a = MainExp (PrimOr a) @@ -133,7 +146,7 @@ | WriteVar Var a -- | Imperative If-then-else | IfBegin (CondInfo a)- | ElseIfBegin (CondInfo a)+-- | ElseIfBegin (CondInfo a) -- It's expressed with nested if-else | ElseBegin | IfEnd -- | looping constructions