packages feed

calculator-0.2.0.0: src/Calculator/Prim/Bindings.hs

module Calculator.Prim.Bindings
    ( Bindings
    , mkBind
    , addVar
    , getVar
    , appendVars
    , addFun
    , getFun
    , display
    ) where

--------------------------------------------------------------------------------

import           Calculator.Prim.Function (Function)

--------------------------------------------------------------------------------

import qualified Data.Map                 as M

--------------------------------------------------------------------------------

-- | Represents variable and function bindings
data Bindings = Bindings {
      varMap :: M.Map String Double
    , funMap :: M.Map String (Function Double)
    }

--------------------------------------------------------------------------------

-- | Make a new binding from two alists
mkBind :: [(String, Double)] -> [(String, Function Double)] -> Bindings
mkBind vars funs = Bindings {
                     varMap = M.fromList vars
                   , funMap = M.fromList funs
                   }

--------------------------------------------------------------------------------

-- | Add a variable to @Bindings@
addVar :: (String, Double) -> Bindings -> Bindings
addVar (s, n) b = b { varMap = M.insert s n (varMap b) }

-- | Get a variable from @Bindings@
getVar :: String -> Bindings -> Maybe Double
getVar s b = M.lookup s (varMap b)

-- | Add a list of variables to @Bindings@
appendVars :: [(String, Double)] -> Bindings -> Bindings
appendVars alist b = foldr addVar b alist

--------------------------------------------------------------------------------

-- | Add a @Function@ to @Bindings@
addFun :: (String, Function Double) -> Bindings -> Bindings
addFun (s, f) b = b { funMap = M.insert s f (funMap b) }

-- | Get a @Function@ from @Bindings@
getFun :: String -> Bindings -> Maybe (Function Double)
getFun s b = M.lookup s (funMap b)

--------------------------------------------------------------------------------

-- | Display all variables
display :: Bindings -> [String]
display b = let alist = M.assocs (varMap b)
            in map (\(s, n) -> s ++ " = " ++ show n) alist

--------------------------------------------------------------------------------