yoko-0.9: Examples/LambdaLift/DeepSeq.hs
{-# LANGUAGE TypeOperators, FlexibleInstances, FlexibleContexts,
UndecidableInstances #-}
{- |
Module : LambdaLift.DeepSeq
Copyright : (c) The University of Kansas 2012
License : BSD3
Maintainer : nicolas.frisby@gmail.com
Stability : experimental
Portability : see LANGUAGE pragmas (... GHC)
An example lambba lifter using @hcompos@.
-}
module LambdaLift.DeepSeq where
import Data.Yoko
class DeepSeq a where rnf :: a -> ()
instance DeepSeq a => DeepSeq [a] where
rnf [] = ()
rnf (x : xs) = rnf x `seq` rnf xs
instance DeepSeq a => DeepSeq (N a) where rnf = rnf . unN
instance (DeepSeq a, DeepSeq b) => DeepSeq (a :+: b) where
rnf = foldPlus rnf rnf
--instance DeepSeq sum => DeepSeq (DCsOf a sum) where rnf = rnf . unDCsOf
instance (DeepSeq a, DeepSeq b) => DeepSeq (a :*: b) where
rnf = foldTimes seq rnf rnf
instance DeepSeq a => DeepSeq (Rec a) where rnf = rnf . unRec
instance DeepSeq a => DeepSeq (Dep a) where rnf = rnf . unDep
instance DeepSeq (f a) => DeepSeq (Par1 f a) where rnf = rnf . unPar1
instance DeepSeq U where rnf U = ()
instance DeepSeq Int where rnf = (`seq` ())
instance (DeepSeq a, DeepSeq b) => DeepSeq (Either a b) where
rnf = either rnf rnf
instance (DeepSeq a, DeepSeq b, DeepSeq c) =>
DeepSeq (a, b, c) where
rnf (a, b, c) = rnf a `seq` rnf b `seq` rnf c
instance (DeepSeq a, DeepSeq b, DeepSeq c, DeepSeq d) =>
DeepSeq (a, b, c, d) where
rnf (a, b, c, d) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d