packages feed

THEff-0.1.0.1: samples/SampleAll.hs

{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE ScopedTypeVariables #-} 
module Main where

import Control.THEff
import Control.THEff.Reader
import Control.THEff.State
import Control.THEff.Exception
import Control.THEff.Catch
import Control.THEff.Writer
import Control.THEff.Fresh
import Control.THEff.Validator
import System.Environment (getProgName)
import Control.Monad 
import Data.Either
import GHC.Float 

mkEff "MyReader"    ''Reader    ''Int       ''Lift
mkEff "SomeState"   ''State     ''Bool      ''MyReader
mkEff "OtherRdr"    ''Reader    ''Float     ''SomeState
mkEff "MyWriter"     ''Writer   ''String    ''OtherRdr
mkEff "MyException" ''Except    ''String   ''MyWriter
mkEff "MyCatch"     ''Catch     ''Int       ''MyException
mkEff "UnicalChar"  ''Fresh     ''Char      ''MyCatch
mkEff "MyVldtr"     ''Validator ''Float     ''UnicalChar

main:: IO ()
main = do
    r <- runMyReader 100 
       $ runSomeState False
       $ runOtherRdr pi 
       $ runMyWriter 
       $ runMyException id 
       $ runMyCatch (("Error code : " ++).show) 
       $ runUnicalChar 'A' $ do
            i :: Int <- asks (*2)                    -- MyReader 
            f :: Float <- ask                        -- OtherRdr
            tell "ProgName="                         -- MyWriter
            b <- get                                 -- SomeState
            put $ not b                              -- SomeState 
            when b $ throwExc "Throw!"               -- MyException 
--            unless b $ throwCtch (123::Int)        -- MyCatch 
            lift $ putStrLn "print from effect!"     -- Lift  
            c1 <- fresh                              -- UnicalChar
            lift $ putStrLn $ "c1=" ++ [c1]          -- Lift  
            c2 <- fresh                              -- UnicalChar 
            lift $ putStrLn $ "c2=" ++ [c2]          -- Lift  
            r <- runMyVldtr (validator (<1000)) $ do
                s <- lift getProgName                 -- Lift
                tell s                                -- MyWriter
                lift $ putStrLn $ "ProgName is " ++ s -- Lift 
                x <- chk $ fromIntegral i * f         -- MyVldtr  
                return $ float2Double x
            return $ either ((++ " is out of range") . show) show r
    print r