module GHC.Vacuum.ClosureType (
   isFun,isThunk,isCon
  ,ClosureType(..)
) where

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

isFun :: ClosureType -> Bool
isFun FUN = True
isFun FUN_1_0 = True
isFun FUN_0_1 = True
isFun FUN_2_0 = True
isFun FUN_1_1 = True
isFun FUN_0_2 = True
isFun FUN_STATIC = True
isFun _ = False

isThunk :: ClosureType -> Bool
isThunk AP = True
isThunk THUNK = True
isThunk THUNK_1_0 = True
isThunk THUNK_0_1 = True
isThunk THUNK_2_0 = True
isThunk THUNK_1_1 = True
isThunk THUNK_0_2 = True
isThunk THUNK_STATIC = True
isThunk THUNK_SELECTOR = True
isThunk _ = False

isCon :: ClosureType -> Bool
isCon CONSTR = True
isCon CONSTR_1_0 = True
isCon CONSTR_0_1 = True
isCon CONSTR_2_0 = True
isCon CONSTR_1_1 = True
isCon CONSTR_0_2 = True
isCon CONSTR_STATIC = True
isCon CONSTR_NOCAF_STATIC = True
isCon _ = False

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

data ClosureType
  = INVALID_OBJECT
  | CONSTR
  | CONSTR_1_0
  | CONSTR_0_1
  | CONSTR_2_0
  | CONSTR_1_1
  | CONSTR_0_2
  | CONSTR_STATIC
  | CONSTR_NOCAF_STATIC
  | FUN
  | FUN_1_0
  | FUN_0_1
  | FUN_2_0
  | FUN_1_1
  | FUN_0_2
  | FUN_STATIC
  | THUNK
  | THUNK_1_0
  | THUNK_0_1
  | THUNK_2_0
  | THUNK_1_1
  | THUNK_0_2
  | THUNK_STATIC
  | THUNK_SELECTOR
  | BCO
  | AP
  | PAP
  | AP_STACK
  | IND
  | IND_OLDGEN
  | IND_PERM
  | IND_OLDGEN_PERM
  | IND_STATIC
  | RET_BCO
  | RET_SMALL
  | RET_BIG
  | RET_DYN
  | RET_FUN
  | UPDATE_FRAME
  | CATCH_FRAME
  | STOP_FRAME
  | CAF_BLACKHOLE
  | BLACKHOLE
  | SE_BLACKHOLE
  | SE_CAF_BLACKHOLE
  | MVAR_CLEAN
  | MVAR_DIRTY
  | ARR_WORDS
  | MUT_ARR_PTRS_CLEAN
  | MUT_ARR_PTRS_DIRTY
  | MUT_ARR_PTRS_FROZEN0
  | MUT_ARR_PTRS_FROZEN
  | MUT_VAR_CLEAN
  | MUT_VAR_DIRTY
  | WEAK
  | STABLE_NAME
  | TSO
  | BLOCKED_FETCH
  | FETCH_ME
  | FETCH_ME_BQ
  | RBH
  | REMOTE_REF
  | TVAR_WATCH_QUEUE
  | INVARIANT_CHECK_QUEUE
  | ATOMIC_INVARIANT
  | TVAR
  | TREC_CHUNK
  | TREC_HEADER
  | ATOMICALLY_FRAME
  | CATCH_RETRY_FRAME
  | CATCH_STM_FRAME
  | WHITEHOLE
  deriving(Eq,Ord,Read,Show)

instance Enum ClosureType where
  fromEnum INVALID_OBJECT          = 0
  fromEnum CONSTR                  = 1
  fromEnum CONSTR_1_0              = 2
  fromEnum CONSTR_0_1              = 3
  fromEnum CONSTR_2_0              = 4
  fromEnum CONSTR_1_1              = 5
  fromEnum CONSTR_0_2              = 6
  fromEnum CONSTR_STATIC           = 7
  fromEnum CONSTR_NOCAF_STATIC     = 8
  fromEnum FUN                     = 9
  fromEnum FUN_1_0                 = 10
  fromEnum FUN_0_1                 = 11
  fromEnum FUN_2_0                 = 12
  fromEnum FUN_1_1                 = 13
  fromEnum FUN_0_2                 = 14
  fromEnum FUN_STATIC              = 15
  fromEnum THUNK                   = 16
  fromEnum THUNK_1_0               = 17
  fromEnum THUNK_0_1               = 18
  fromEnum THUNK_2_0               = 19
  fromEnum THUNK_1_1               = 20
  fromEnum THUNK_0_2               = 21
  fromEnum THUNK_STATIC            = 22
  fromEnum THUNK_SELECTOR          = 23
  fromEnum BCO                     = 24
  fromEnum AP                      = 25
  fromEnum PAP                     = 26
  fromEnum AP_STACK                = 27
  fromEnum IND                     = 28
  fromEnum IND_OLDGEN              = 29
  fromEnum IND_PERM                = 30
  fromEnum IND_OLDGEN_PERM         = 31
  fromEnum IND_STATIC              = 32
  fromEnum RET_BCO                 = 33
  fromEnum RET_SMALL               = 34
  fromEnum RET_BIG                 = 35
  fromEnum RET_DYN                 = 36
  fromEnum RET_FUN                 = 37
  fromEnum UPDATE_FRAME            = 38
  fromEnum CATCH_FRAME             = 39
  fromEnum STOP_FRAME              = 40
  fromEnum CAF_BLACKHOLE           = 41
  fromEnum BLACKHOLE               = 42
  fromEnum SE_BLACKHOLE            = 43
  fromEnum SE_CAF_BLACKHOLE        = 44
  fromEnum MVAR_CLEAN              = 45
  fromEnum MVAR_DIRTY              = 46
  fromEnum ARR_WORDS               = 47
  fromEnum MUT_ARR_PTRS_CLEAN      = 48
  fromEnum MUT_ARR_PTRS_DIRTY      = 49
  fromEnum MUT_ARR_PTRS_FROZEN0    = 50
  fromEnum MUT_ARR_PTRS_FROZEN     = 51
  fromEnum MUT_VAR_CLEAN           = 52
  fromEnum MUT_VAR_DIRTY           = 53
  fromEnum WEAK                    = 54
  fromEnum STABLE_NAME             = 55
  fromEnum TSO                     = 56
  fromEnum BLOCKED_FETCH           = 57
  fromEnum FETCH_ME                = 58
  fromEnum FETCH_ME_BQ             = 59
  fromEnum RBH                     = 60
  fromEnum REMOTE_REF              = 62
  fromEnum TVAR_WATCH_QUEUE        = 63
  fromEnum INVARIANT_CHECK_QUEUE   = 64
  fromEnum ATOMIC_INVARIANT        = 65
  fromEnum TVAR                    = 66
  fromEnum TREC_CHUNK              = 67
  fromEnum TREC_HEADER             = 68
  fromEnum ATOMICALLY_FRAME        = 69
  fromEnum CATCH_RETRY_FRAME       = 70
  fromEnum CATCH_STM_FRAME         = 71
  fromEnum WHITEHOLE               = 72
  toEnum 0 = INVALID_OBJECT
  toEnum 1 = CONSTR
  toEnum 2 = CONSTR_1_0
  toEnum 3 = CONSTR_0_1
  toEnum 4 = CONSTR_2_0
  toEnum 5 = CONSTR_1_1
  toEnum 6 = CONSTR_0_2
  toEnum 7 = CONSTR_STATIC
  toEnum 8 = CONSTR_NOCAF_STATIC
  toEnum 9 = FUN
  toEnum 10 = FUN_1_0
  toEnum 11 = FUN_0_1
  toEnum 12 = FUN_2_0
  toEnum 13 = FUN_1_1
  toEnum 14 = FUN_0_2
  toEnum 15 = FUN_STATIC
  toEnum 16 = THUNK
  toEnum 17 = THUNK_1_0
  toEnum 18 = THUNK_0_1
  toEnum 19 = THUNK_2_0
  toEnum 20 = THUNK_1_1
  toEnum 21 = THUNK_0_2
  toEnum 22 = THUNK_STATIC
  toEnum 23 = THUNK_SELECTOR
  toEnum 24 = BCO
  toEnum 25 = AP
  toEnum 26 = PAP
  toEnum 27 = AP_STACK
  toEnum 28 = IND
  toEnum 29 = IND_OLDGEN
  toEnum 30 = IND_PERM
  toEnum 31 = IND_OLDGEN_PERM
  toEnum 32 = IND_STATIC
  toEnum 33 = RET_BCO
  toEnum 34 = RET_SMALL
  toEnum 35 = RET_BIG
  toEnum 36 = RET_DYN
  toEnum 37 = RET_FUN
  toEnum 38 = UPDATE_FRAME
  toEnum 39 = CATCH_FRAME
  toEnum 40 = STOP_FRAME
  toEnum 41 = CAF_BLACKHOLE
  toEnum 42 = BLACKHOLE
  toEnum 43 = SE_BLACKHOLE
  toEnum 44 = SE_CAF_BLACKHOLE
  toEnum 45 = MVAR_CLEAN
  toEnum 46 = MVAR_DIRTY
  toEnum 47 = ARR_WORDS
  toEnum 48 = MUT_ARR_PTRS_CLEAN
  toEnum 49 = MUT_ARR_PTRS_DIRTY
  toEnum 50 = MUT_ARR_PTRS_FROZEN0
  toEnum 51 = MUT_ARR_PTRS_FROZEN
  toEnum 52 = MUT_VAR_CLEAN
  toEnum 53 = MUT_VAR_DIRTY
  toEnum 54 = WEAK
  toEnum 55 = STABLE_NAME
  toEnum 56 = TSO
  toEnum 57 = BLOCKED_FETCH
  toEnum 58 = FETCH_ME
  toEnum 59 = FETCH_ME_BQ
  toEnum 60 = RBH
  toEnum 62 = REMOTE_REF
  toEnum 63 = TVAR_WATCH_QUEUE
  toEnum 64 = INVARIANT_CHECK_QUEUE
  toEnum 65 = ATOMIC_INVARIANT
  toEnum 66 = TVAR
  toEnum 67 = TREC_CHUNK
  toEnum 68 = TREC_HEADER
  toEnum 69 = ATOMICALLY_FRAME
  toEnum 70 = CATCH_RETRY_FRAME
  toEnum 71 = CATCH_STM_FRAME
  toEnum 72 = WHITEHOLE
  toEnum n  = error ("toEnum: ClosureType: invalid ClosureType: " ++ show n)