DerivingEnum.hs

Plain text version of DerivingEnum.hs

module DerivingEnum where
import DerivingUtils

deriveEnum stdnames src t@(_,TypeInfo{constructors=cs}) =
  do let pv = stdvalue stdnames mod_Prelude
     HsVar fromEnum <- pv "fromEnum"
     HsVar toEnum <- pv "toEnum"
     if isEnum cs
       then return (fromToEnum src fromEnum toEnum t id)
       else fail "Deriving Enum: the type is not an enumeration."

fromToEnum src fromEnum toEnum t@(_,TypeInfo{constructors=cs}) sig =
   [fromEnumDef,toEnumDef]
 where
  cns = zip [0..] cs

  fromEnumDef = fun src (map fromAlt cns)
  toEnumDef = fun src (map toAlt cns)

  fromAlt (n,ci) = alt1 src fromEnum (con c)
			((if n==0 then sig else id) (hsLit src (HsInt n)))
    where c = convCon t (conName ci)

  toAlt (n,ci) = alt1 src toEnum (hsPLit src (HsInt n)) (con c)
    where c = convCon t (conName ci)

Valid HTML?