-------------------------------------------------------------------------
--  
--     StoreFun.hs
--  
--         An abstract data type of stores of integers, implemented as functions.
--                                  
--         (c) Addison-Wesley, 1996-2011.                   
--  
-------------------------------------------------------------------------


-- An alternative implementation of Store.hs. Note that although
-- it is equivalent to the list implementation as far as the operations
-- initial, value, update are concerned, it is not possible to compare for
-- equality or to show as a String.

module StoreFun 
   ( Store, 
     initial,     -- Store
     value,       -- Store -> Var -> Integer
     update       -- Store -> Var -> Integer -> Store
    ) where

-- Var is the type of variables.                    

type Var = Char

newtype Store = Store (Var -> Integer)                  
--  
initial :: Store 

initial :: Store
initial = (Var -> Integer) -> Store
Store (\Var
v -> Integer
0)

value :: Store -> Var -> Integer

value :: Store -> Var -> Integer
value (Store Var -> Integer
sto) Var
v = Var -> Integer
sto Var
v

update  :: Store -> Var -> Integer -> Store

update :: Store -> Var -> Integer -> Store
update (Store Var -> Integer
sto) Var
v Integer
n 
  = (Var -> Integer) -> Store
Store (\Var
w -> if Var
vVar -> Var -> Bool
forall a. Eq a => a -> a -> Bool
==Var
w then Integer
n else Var -> Integer
sto Var
w)