{- Author:     Jeff Newbern
   Maintainer: Jeff Newbern <jnewbern@nomaware.com>
   Time-stamp: <Wed Aug 13 12:48:58 2003>
   License:    GPL
-}

{- DESCRIPTION

Example 9 - Using the msum function

Usage: Compile the code and execute the resulting program.
       The first argument is a variable name, the second
       is an environment stack (list of String to String
       association lists).
       
Try: ./ex9 'depth' '[[("name","test"),("depth","2")], [("depth","1")]]'
     ./ex9 'width' '[[("name","test"),("depth","2")], [("depth","1")]]'
     ./ex9 'var3'  '[[("var1","value1"),("var2","value2*")], [("var2","value2"),("var3","value3")]]'
     ./ex9 'var2'  '[[("var1","value1"),("var2","value2*")], [("var2","value2"),("var3","value3")]]'
     ./ex9 'var1'  '[[("var1","value1"),("var2","value2*")], [("var2","value2"),("var3","value3")]]'
     ./ex9 'var'   '[[("var1","value1"),("var2","value2*")], [("var2","value2"),("var3","value3")]]'
-}

import System
import Monad

type Variable = String
type Value = String
type EnvironmentStack = [[(Variable,Value)]]

-- lookupVar retrieves a variable's value from the environment stack
-- It uses msum in the Maybe monad to return the first non-Nothing value.
lookupVar :: Variable -> EnvironmentStack -> Maybe Value
lookupVar var stack = msum $ map (lookup var) stack

{- Without using msum, we would have to do something like:
lookupVar :: Variable -> EnvironmentStack -> Maybe Value
lookupVar var []     = Nothing
lookupVar var (e:es) = let val = lookup var e
                       in maybe (lookupVar var es) Just val
--}

-- lookup the variable named in arg!!0 in the environment stack
-- given in arg!!1
main :: IO ()
main = do args <- getArgs
          print $ lookupVar (args!!0) (read (args!!1))

-- END OF FILE
