hs-hourglass
hs-hourglass copied to clipboard
Need rewrite rules for fromIntegral
It seems that newtypes such as Seconds
need rewrite rules in order for fromIntegral
to work efficiently. Perhaps something inspired by these general rules for Int64
from GHC.Int:
{-# RULES
"fromIntegral/a->Int64" fromIntegral = \x -> case fromIntegral x of I# x# -> I64# x#
"fromIntegral/Int64->a" fromIntegral = \(I64# x#) -> fromIntegral (I# x#)
#-}
Without such rules, we temporarily create an indefinite-precision Integer
:
module T where
import Data.Hourglass
import Data.Word
foo :: Word32 -> Seconds
foo = fromIntegral
$ ghc -O2 -ddump-simpl -dsuppress-all t.hs
[1 of 1] Compiling T ( t.hs, t.o )
==================== Tidy Core ====================
Result size of Tidy Core = {terms: 12, types: 6, coercions: 2}
foo
foo =
\ ds_a1Ed ->
case ds_a1Ed of _ { W32# x#_a1Eg ->
case integerToInt (wordToInteger x#_a1Eg)
of wild1_a1TV { __DEFAULT ->
(I64# wild1_a1TV) `cast` ...
}
}
(Tested using hourglass-0.2.9
.)
Good idea. Any chance you can make that in a PR ?