-- | Enumerations of the unary and binary math unit generators.
module Sound.SC3.UGen.Operator (Unary(..), unaryName,
                                Binary(..), binaryName) where

data Unary  = Neg
            | Not
            | IsNil
            | NotNil
            | BitNot
            | Abs
            | AsFloat
            | AsInt
            | Ceil
            | Floor
            | Frac
            | Sign
            | Squared
            | Cubed
            | Sqrt
            | Exp
            | Recip
            | MIDICPS
            | CPSMIDI
            | MIDIRatio
            | RatioMIDI
            | DbAmp
            | AmpDb
            | OctCPS
            | CPSOct
            | Log
            | Log2
            | Log10
            | Sin
            | Cos
            | Tan
            | ArcSin
            | ArcCos
            | ArcTan
            | SinH
            | CosH
            | TanH
            | Rand
            | Rand2
            | LinRand
            | BiLinRand
            | Sum3Rand
            | Distort
            | SoftClip
            | Coin
            | DigitValue
            | Silence
            | Thru
            | RectWindow
            | HanWindow
            | WelchWindow
            | TriWindow
            | Ramp
            | SCurve
              deriving (Eq, Show, Enum)

data Binary = Add
            | Sub
            | Mul
            | IDiv
            | FDiv
            | Mod
            | EQ_
            | NE
            | LT_
            | GT_
            | LE
            | GE
            | Min
            | Max
            | BitAnd
            | BitOr
            | BitXor
            | LCM
            | GCD
            | Round
            | RoundUp
            | Trunc
            | Atan2
            | Hypot
            | Hypotx
            | Pow
            | ShiftLeft
            | ShiftRight
            | UnsignedShift
            | Fill
            | Ring1
            | Ring2
            | Ring3
            | Ring4
            | DifSqr
            | SumSqr
            | SqrSum
            | SqrDif
            | AbsDif
            | Thresh
            | AMClip
            | ScaleNeg
            | Clip2
            | Excess
            | Fold2
            | Wrap2
            | FirstArg
            | RandRange
            | ExpRandRange
              deriving (Eq, Show, Enum)

-- | Provide symbolic names for standard unary operators.
unaryName :: Int -> String
unaryName   0 = "-"
unaryName   n = show (toEnum n :: Unary)

-- | Provide symbolic names for standard binary operators.
binaryName :: Int -> String
binaryName  0 = "+"
binaryName  1 = "-"
binaryName  2 = "*"
binaryName  4 = "/"
binaryName  5 = "%"
binaryName  6 = "=="
binaryName  7 = "/="
binaryName  8 = "<"
binaryName  9 = ">"
binaryName 10 = "<="
binaryName 11 = ">="
binaryName 25 = "**"
binaryName n  = show (toEnum n :: Binary)