--
-- Abstract Data Types
--

{-- A Dictionary ADT
data Dictionary k v

newDictionary :: Dictionary k v
put           :: (Ord k) => Dictionary k v -> k -> v -> Dictionary k v
condGet       :: (Ord k) => Dictionary k v -> k -> v -> v
domain        :: Dictionary k v -> [k]

---}

module Main (main) where
import DictionaryADT (Dictionary,newDictionary,put,condGet,domain)

main = let d1 = (put (put (put newDictionary 5 "foo") 2 "bar") 3 "zee")
           d1d = domain d1
       in do print d1                      
             print (condGet d1 2 "None")
             print (condGet d1 4 "None")
             print d1d
             print (fmap (\(x,y) -> (x*x,y++y)) d1)

{--- Use. e.g., as follows:

% runghc dictionary-client.hs
[(2,"bar"),(3,"zee"),(5,"foo")]
"bar"
"None"
[2,3,5]
[(4,"barbar"),(9,"zeezee"),(25,"foofoo")]

---}