{-# LANGUAGE ScopedTypeVariables #-}
module Fib where

import Error
import Control.Monad
import Exception

fibErr :: Int -> Int
fibErr 1 = 1
fibErr n 
  | n > 1 = fibErr (n - 1) + fibErr (n - 2)
fibErr n = error' $  "Fib with negative number: " 
                  ++ show n

err0       = testFibErr 0
err1       = testFibErr 1
err2       = testFibErr 2
err3       = testFibErr 3
err4       = testFibErr 4
err5       = testFibErr 5
err10      = testFibErr 10
err100     = testFibErr 100
err1000    = testFibErr 1000
err10000   = testFibErr 10000
err100000  = testFibErr 100000

testFibErr :: Int -> IO ()
testFibErr n = do
  replicateM_ 10000000 $ (do
    () <- return $ (fibErr n) `seq` ()
    return ()) `gcatch` (\(e :: SomeException) -> do
      () <- return $ (length (show e)) `seq` ()
      return ()
      )
