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 } -------------------------------------------------------------------------------- -- | Make a new binding from two alists mkBind :: [(String, Double)] -> [(String, Function)] -> 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) -> Bindings -> Bindings addFun (s, f) b = b { funMap = M.insert s f (funMap b) } -- | Get a @Function@ from @Bindings@ getFun :: String -> Bindings -> Maybe Function 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 --------------------------------------------------------------------------------