module DerivingBounded where import DerivingUtils deriveBounded stdnames src t@(_,TypeInfo{constructors=cs}) = do let pv = stdvalue stdnames mod_Prelude HsVar minBound <- pv "minBound" HsVar maxBound <- pv "maxBound" let enumBounds cs@(c:_) = [b minBound c,b maxBound (last cs)] b m ci = fun0 src m (con c) where c=convCon t (conName ci) tupleBounds [ConInfo{conName=c0,conArity=n}] = [tb minBound,tb maxBound] where tb m = fun0 src m (apps (con c:replicate n (var m))) c=convCon t c0 if isEnum cs then return (enumBounds cs) else if length cs == 1 then return (tupleBounds cs) else fail "Deriving Bounded: the type is neither an enumeration nor a single constructor type."