packages feed

leaky-0.2.0.0: Types_no_SOP.hs

-------------------------------------------------------------------------------

  {-  OPTIONS_GHC -O2 #-}
  {-# OPTIONS_GHC -O0 #-}

  {-# LANGUAGE CPP #-}

  {-# LANGUAGE DeriveDataTypeable #-}
  {-# LANGUAGE DeriveGeneric #-}
  {-# LANGUAGE StandaloneDeriving #-}

-------------------------------------------------------------------------------

-- For certain kinds of debugging, esp. of deepseq-bounded...
#define REQUIRE_DATA_INSTANCE 0

-------------------------------------------------------------------------------

  module Types_no_SOP where

  import Control.DeepSeq.Bounded
  import Control.DeepSeq.Generics

--import Generics.SOP.TH
  import GHC.Generics ( Generic )
  import Data.Typeable ( Typeable )
  import Data.Data ( Data )

  import System.Random

#if 0
#if FORCING_STRATEGY == 4
  import Seqaid.Runtime ( seqaid )
#endif
#if FORCING_STRATEGY >= 5
--import Seqaid.Runtime  -- comes in with Seqaid.TH
  import Seqaid.TH
#endif
#endif

-------------------------------------------------------------------------------

  type State = TA

  -- This is behaviourally a "strict blob", within the diagnostic
  -- purposes of leaky.  It incurs a large, constant cost when
  -- the head is evaluated.  This is also a reasonable model
  -- for function application (except then the cost is usually
  -- a function of argument values). [?]
  data Blob a = Blob [a]  deriving (Show,Generic,Typeable,Data)
  instance (NFData a,Num a) => NFData (Blob a) where rnf x = force (doWork x) `seq` ()
  instance (NFData a,Num a) => NFDataN (Blob a) where rnfn n x = force (doWork x) `seq` ()
#if REQUIRE_DATA_INSTANCE
  instance (NFData a,Num a,Typeable a,Data a) => NFDataP (Blob a) where rnfp p x = force (doWork x) `seq` ()
#else
  instance (NFData a,Num a,Typeable a) => NFDataP (Blob a) where rnfp p x = force (doWork x) `seq` ()
#endif
  doWork :: Num a => Blob a -> a
  doWork (Blob lst) = sum lst
--doWork (Blob lst) = sum lst :: Num a => a

-- XXX Why exactly is this needed, when it wasn't needed when
-- everything was in one module??...
#if 0
  {-# NOINLINE hackblah #-}
  hackblah :: IO StdGen
  hackblah = getStdGen
#else
  deriving instance Typeable StdGen
#if REQUIRE_DATA_INSTANCE
  instance Data StdGen  -- only for certain deepseq-bounded debugging
#endif
  instance NFData StdGen where rnf x = ()
  instance NFDataN StdGen where rnfn n x = ()
  instance NFDataP StdGen where rnfp p x = ()
#endif

#if 1

  -- (No strict fields.)
  data TA = A1 Int | A2 TB Int TC
  data TB = B1 | B2 TC | B3 Int TA TB
#if USE_STRICT_BLOB
  -- Note: I think Blob must NOT have a strictness bang (!).
  -- Later: I doubt it matters, the way doing Blob's now...
  data TC = C1 Int TC | C2 Int | C3 TC (Blob Int) ![Int] TC
#else
  data TC = C1 Int TC | C2 Int | C3 TC ![Int] TC
#endif

#else

  -- All Int fields strict (!):
  data TA = A1 !Int | A2 TB !Int TC
  data TB = B1 | B2 TC | B3 !Int TA TB
#if USE_STRICT_BLOB
  -- Note: I think Blob must NOT have a strictness bang (!).
  -- Later: I doubt it matters, the way doing Blob's now...
  data TC = C1 !Int TC | C2 !Int | C3 TC (Blob Int) ![Int] TC
#else
  data TC = C1 !Int TC | C2 !Int | C3 TC ![Int] TC
#endif

#endif

-------------------------------------------------------------------------------