packages feed

KiCS-debugger-0.1.0: biosphere/src/Curry/Debugger/Tools/Observations/Monad.lhs

> {-# OPTIONS_GHC -fglasgow-exts #-}
> module Curry.Debugger.Tools.Observations.Monad where

> import Control.Monad.Trans
> import Control.Monad
> import Curry.Debugger.DebugMonad

> import Curry.Debugger.ShowTerm

> data ObservationsState = OS { fnames :: [String]
>                             , obs :: [(String, [String])] }

> instance Monad m => DM (DMT ObservationsState m) where

>   funcCallHook fname info ma = do
>     r <- ma
>     st <- getToolState
>     let args = currentValues (dynamicInfo info)
>     when
>       (elem fname $ fnames st)
>       (addObs fname $ showFuncCall fname args $ genTerm r)
>     return r

> showFuncCall :: String -> [Term] -> Term -> String
> showFuncCall func args result =
>   (niceFname func) ++ " " ++ showedArgs ++ "= " ++ showTerm result
>     where
>       showedArgs = concatMap (\ t -> showTerm t ++ " ") args

> niceFname fname =
>   let c = head fname
>   in  if c < 'a' || c > 'z' then
>           '(' : fname ++ ")"
>       else
>           fname

> addObs fname val = modifyToolState $
>                        \st -> st { obs = add fname val $ obs st }
>   where
>     add n v [] = [(n, [v])]
>     add n v ((n', vs) : nvs)
>       | n == n' = (n, v : vs) : nvs
>       | otherwise = (n', vs) : add n v nvs

> observe exp = do
>     r <- exp
>     st <- getToolState
>     return (r, obs st)

> run exp fname = do
>   putStrLn "Enter names of functions to observe:"
>   fns <- getLine
>   (r, os) <- debugDMT (observe exp) fname $ OS { fnames = words fns, obs = [] }
>   putStr "Result: "
>   putStrLn $ showGenTerm r
>   putStrLn ""
>   putStrLn "Observations"
>   putStrLn "============"
>   printObservations os

> printObservations [] = return ()
> printObservations ((_, es) : os) = do
>   mapM_ (liftIO . putStrLn) $ reverse es
>   printObservations os