{-# OPTIONS -cpp #-}
--
-- Should evaluate to '3', unless something goes wrong.
--
-- Not so bad to use AltData, as it is already derived for all the basic
-- types. Then, just replace deriving Typeable, with hand-derived
-- instance of Typeable (see hs-plugins/examples/eval/eval_fn1/Poly.hs
--
--

#include "../../../config.h"

import Eval.Haskell
import AltData.Dynamic

-- import Data.Dynamic

pkgconf = TOP ++ "/plugins.conf.inplace"

main = do
    a <- return $ toDyn (3::Int)

    m_b <- unsafeEval_ "\\dyn -> fromMaybe (7 :: Int) (fromDyn dyn)"
                ["AltData.Dynamic","Data.Maybe"]  -- imports

                [ "-package-conf "++pkgconf , "-package altdata" ]

                [ pkgconf ]
                []
                

{-
-- should work, but doesn't. type check fails 
-- (due to static vs dynamic typing issue)

     m_b <- unsafeEval_ "\\dyn -> fromMaybe (7 :: Int) (fromDynamic dyn)"
                                ["Data.Dynamic","Data.Maybe"] [] []
-}

    case m_b of 
        Left s   -> mapM_ putStrLn s
        Right b  -> putStrLn $ show (b a :: Int)