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
--------------------------------------------------------------------------------