content: -------------------------------------------------------------------------------
  -- A parallel implementation of fib in Haskell using semi-explicit
  -- parallelism expressed with `par` and `pseq`
  
  module ParFib.Main (main) where
  
  import Control.Parallel
  
  -------------------------------------------------------------------------------
  -- A purely sequential implementaiton of fib.
  
  seqFib :: Int -> Integer
  seqFib 0 = 1
  seqFib 1 = 1
  seqFib n = seqFib (n-1) + seqFib (n-2)
  
  -------------------------------------------------------------------------------
  -- A thresh-hold value below which the parallel implementation of fib
  -- reverts to sequential implementation.
  
  threshHold :: Int
  threshHold = 25
  
  -------------------------------------------------------------------------------
  -- A parallel implementation of fib.
  
  parFib :: Int -> Integer
  parFib n
    = if n < threshHold then
        seqFib n
      else
        r `par` (l `pseq` l + r)
      where
      l  = parFib (n-1)
      r  = parFib (n-2)
  
  -------------------------------------------------------------------------------
  
  result :: Integer
  result = parFib 24
  
  -------------------------------------------------------------------------------
  
  main :: IO String
  main
    = do pseq result (return ())
         putStrLn $ "running 'A single file with a code to run in parallel' from MainModule/ParFib, which says fib 24 = " ++ show result
         return $ show result
  
  -------------------------------------------------------------------------------
  