fastBool False = 0#
isFastTrue x = x ==# 1#
+-- note that fastOr and fastAnd are strict in both arguments
+-- since they are unboxed
fastOr 1# _ = 1#
fastOr 0# x = x
type FastBool = Bool
fastBool x = x
isFastTrue x = x
-fastOr = (||)
-fastAnd = (&&)
+-- make sure these are as strict as the unboxed version,
+-- so that the performance characteristics match
+fastOr False False = False
+fastOr _ _ = True
+fastAnd True True = True
+fastAnd _ _ = False
--These are among the type-signatures necessary for !ghc to compile
-- but break ghc (can't give a signature for an import...)
+--Note that the comparisons actually do return Bools not FastBools.
(+#) :: FastInt -> FastInt -> FastInt
(-#) :: FastInt -> FastInt -> FastInt
(*#) :: FastInt -> FastInt -> FastInt
(>#) :: FastInt -> FastInt -> Bool
#endif /* ! __GLASGOW_HASKELL__ */
--- however it's still possible to check that these are
--- valid signatures nonetheless (e.g., ==# returns Bool
--- not FastBool/Int# !)
-_signatures =
- ( (+#) :: FastInt -> FastInt -> FastInt
- , (-#) :: FastInt -> FastInt -> FastInt
- , (*#) :: FastInt -> FastInt -> FastInt
- , (==#) :: FastInt -> FastInt -> Bool
- , (<#) :: FastInt -> FastInt -> Bool
- , (<=#) :: FastInt -> FastInt -> Bool
- , (>=#) :: FastInt -> FastInt -> Bool
- , (>#) :: FastInt -> FastInt -> Bool
- )
-- type-signatures will improve the non-ghc-specific versions
-- and keep things accurate (and ABLE to compile!)