{-# LANGUAGE CPP #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE NoStrict #-}
{-# LANGUAGE TupleSections #-}
module Data.IP.Builder
(
ipBuilder
, ipv4Builder
, ipv6Builder
) where
import qualified Data.ByteString.Builder as B
import qualified Data.ByteString.Builder.Prim as P
import Data.ByteString.Builder.Prim ((>$<), (>*<))
import GHC.Exts
import GHC.Word (Word8(..), Word16(..), Word32(..))
import Data.IP.Addr
{-# INLINE ipBuilder #-}
ipBuilder :: IP -> B.Builder
ipBuilder :: IP -> Builder
ipBuilder (IPv4 IPv4
addr) = IPv4 -> Builder
ipv4Builder IPv4
addr
ipBuilder (IPv6 IPv6
addr) = IPv6 -> Builder
ipv6Builder IPv6
addr
{-# INLINE ipv4Builder #-}
ipv4Builder :: IPv4 -> B.Builder
ipv4Builder :: IPv4 -> Builder
ipv4Builder IPv4
addr = forall a. BoundedPrim a -> a -> Builder
P.primBounded BoundedPrim Word32
ipv4Bounded forall a b. (a -> b) -> a -> b
$! IPv4 -> Word32
fromIPv4w IPv4
addr
{-# INLINE ipv6Builder #-}
ipv6Builder :: IPv6 -> B.Builder
ipv6Builder :: IPv6 -> Builder
ipv6Builder IPv6
addr = forall a. BoundedPrim a -> a -> Builder
P.primBounded BoundedPrim (Word32, Word32, Word32, Word32)
ipv6Bounded forall a b. (a -> b) -> a -> b
$! IPv6 -> (Word32, Word32, Word32, Word32)
fromIPv6w IPv6
addr
toB :: P.FixedPrim a -> P.BoundedPrim a
toB :: forall a. FixedPrim a -> BoundedPrim a
toB = forall a. FixedPrim a -> BoundedPrim a
P.liftFixedToBounded
{-# INLINE toB #-}
ipv4Bounded :: P.BoundedPrim Word32
ipv4Bounded :: BoundedPrim Word32
ipv4Bounded =
Word32 -> (((Word8, ()), (Word8, ())), ((Word8, ()), Word8))
quads forall (f :: * -> *) b a. Contravariant f => (b -> a) -> f a -> f b
>$< ((BoundedPrim Word8
P.word8Dec forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
>*< forall {b}. BoundedPrim b
dotsep) forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
>*< (BoundedPrim Word8
P.word8Dec forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
>*< forall {b}. BoundedPrim b
dotsep))
forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
>*< ((BoundedPrim Word8
P.word8Dec forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
>*< forall {b}. BoundedPrim b
dotsep) forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
>*< BoundedPrim Word8
P.word8Dec)
where
quads :: Word32 -> (((Word8, ()), (Word8, ())), ((Word8, ()), Word8))
quads Word32
a = ((Int# -> Word32 -> (Word8, ())
qdot Int#
0o30# Word32
a, Int# -> Word32 -> (Word8, ())
qdot Int#
0o20# Word32
a), (Int# -> Word32 -> (Word8, ())
qdot Int#
0o10# Word32
a, Word32 -> Word8
qfin Word32
a))
{-# INLINE quads #-}
qdot :: Int# -> Word32 -> (Word8, ())
qdot Int#
s (W32# Word32#
a) = (Word8# -> Word8
W8# (Word# -> Word8#
wordToWord8Compat# ((Word32# -> Word#
word32ToWordCompat# Word32#
a Word# -> Int# -> Word#
`uncheckedShiftRL#` Int#
s) Word# -> Word# -> Word#
`and#` Word#
0xff##)), ())
{-# INLINE qdot #-}
qfin :: Word32 -> Word8
qfin (W32# Word32#
a) = Word8# -> Word8
W8# (Word# -> Word8#
wordToWord8Compat# (Word32# -> Word#
word32ToWordCompat# Word32#
a Word# -> Word# -> Word#
`and#` Word#
0xff##))
{-# INLINE qfin #-}
dotsep :: BoundedPrim b
dotsep = forall a b. a -> b -> a
const Word8
0x2e forall (f :: * -> *) b a. Contravariant f => (b -> a) -> f a -> f b
>$< forall a. FixedPrim a -> BoundedPrim a
toB FixedPrim Word8
P.word8
data FF = CHL Word32
| HL Word32
| NOP
| COL
| CC
| CLO Word32
| CHC Word32
| HC Word32
ipv6Bounded :: P.BoundedPrim (Word32, Word32, Word32, Word32)
ipv6Bounded :: BoundedPrim (Word32, Word32, Word32, Word32)
ipv6Bounded =
forall a.
(a -> Bool) -> BoundedPrim a -> BoundedPrim a -> BoundedPrim a
P.condB (Word32, Word32, Word32, Word32) -> Bool
generalCase
( (Word32, Word32, Word32, Word32) -> ((FF, FF), (FF, FF))
genFields forall (f :: * -> *) b a. Contravariant f => (b -> a) -> f a -> f b
>$< BoundedPrim ((FF, FF), (FF, FF))
output128 )
( forall a.
(a -> Bool) -> BoundedPrim a -> BoundedPrim a -> BoundedPrim a
P.condB (Word32, Word32, Word32, Word32) -> Bool
v4mapped
( forall {a} {b} {a} {b}. (a, b, a, b) -> ((a, b), (a, b))
pairPair forall (f :: * -> *) b a. Contravariant f => (b -> a) -> f a -> f b
>$< (forall {b}. BoundedPrim b
colsep forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
>*< forall {b}. BoundedPrim b
colsep)
forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
>*< (forall {b}. BoundedPrim b
ffff forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
>*< (forall a. a -> ((), a)
fstUnit forall (f :: * -> *) b a. Contravariant f => (b -> a) -> f a -> f b
>$< forall {b}. BoundedPrim b
colsep forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
>*< BoundedPrim Word32
ipv4Bounded)) )
( forall {a} {b} {a} {b}. (a, b, a, b) -> ((a, b), (a, b))
pairPair forall (f :: * -> *) b a. Contravariant f => (b -> a) -> f a -> f b
>$< (forall {b}. BoundedPrim b
P.emptyB forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
>*< forall {b}. BoundedPrim b
colsep) forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
>*< (forall {b}. BoundedPrim b
colsep forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
>*< BoundedPrim Word32
ipv4Bounded) ) )
where
{-# INLINE output128 #-}
{-# INLINE output64 #-}
{-# INLINE generalCase #-}
{-# INLINE v4mapped #-}
{-# INLINE output32 #-}
generalCase :: (Word32, Word32, Word32, Word32) -> Bool
generalCase :: (Word32, Word32, Word32, Word32) -> Bool
generalCase (Word32
w0, Word32
w1, Word32
w2, Word32
w3) =
Word32
w0 forall a. Eq a => a -> a -> Bool
/= Word32
0 Bool -> Bool -> Bool
|| Word32
w1 forall a. Eq a => a -> a -> Bool
/= Word32
0 Bool -> Bool -> Bool
|| (Word32
w2 forall a. Eq a => a -> a -> Bool
/= Word32
0xffff Bool -> Bool -> Bool
&& (Word32
w2 forall a. Eq a => a -> a -> Bool
/= Word32
0 Bool -> Bool -> Bool
|| Word32
w3 forall a. Ord a => a -> a -> Bool
<= Word32
0xffff))
v4mapped :: (Word32, Word32, Word32, Word32) -> Bool
v4mapped :: (Word32, Word32, Word32, Word32) -> Bool
v4mapped (Word32
w0, Word32
w1, Word32
w2, Word32
_) =
Word32
w0 forall a. Eq a => a -> a -> Bool
== Word32
0 Bool -> Bool -> Bool
&& Word32
w1 forall a. Eq a => a -> a -> Bool
== Word32
0 Bool -> Bool -> Bool
&& Word32
w2 forall a. Eq a => a -> a -> Bool
== Word32
0xffff
output128 :: P.BoundedPrim ((FF, FF), (FF, FF))
output128 :: BoundedPrim ((FF, FF), (FF, FF))
output128 = BoundedPrim (FF, FF)
output64 forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
>*< BoundedPrim (FF, FF)
output64
output64 :: BoundedPrim (FF, FF)
output64 = (BoundedPrim FF
output32 forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
>*< BoundedPrim FF
output32)
output32 :: P.BoundedPrim FF
output32 :: BoundedPrim FF
output32 =
forall a.
(a -> Bool) -> BoundedPrim a -> BoundedPrim a -> BoundedPrim a
P.condB (\case { CHL Word32
_ -> Bool
True; FF
_ -> Bool
False }) BoundedPrim FF
build_CHL forall a b. (a -> b) -> a -> b
$
forall a.
(a -> Bool) -> BoundedPrim a -> BoundedPrim a -> BoundedPrim a
P.condB (\case { HL Word32
_ -> Bool
True; FF
_ -> Bool
False }) BoundedPrim FF
build_HL forall a b. (a -> b) -> a -> b
$
forall a.
(a -> Bool) -> BoundedPrim a -> BoundedPrim a -> BoundedPrim a
P.condB (\case { FF
NOP -> Bool
True; FF
_ -> Bool
False }) forall {b}. BoundedPrim b
build_NOP forall a b. (a -> b) -> a -> b
$
forall a.
(a -> Bool) -> BoundedPrim a -> BoundedPrim a -> BoundedPrim a
P.condB (\case { FF
COL -> Bool
True; FF
_ -> Bool
False }) forall {b}. BoundedPrim b
build_COL forall a b. (a -> b) -> a -> b
$
forall a.
(a -> Bool) -> BoundedPrim a -> BoundedPrim a -> BoundedPrim a
P.condB (\case { FF
CC -> Bool
True; FF
_ -> Bool
False }) forall {b}. BoundedPrim b
build_CC forall a b. (a -> b) -> a -> b
$
forall a.
(a -> Bool) -> BoundedPrim a -> BoundedPrim a -> BoundedPrim a
P.condB (\case { CLO Word32
_ -> Bool
True; FF
_ -> Bool
False }) BoundedPrim FF
build_CLO forall a b. (a -> b) -> a -> b
$
forall a.
(a -> Bool) -> BoundedPrim a -> BoundedPrim a -> BoundedPrim a
P.condB (\case { CHC Word32
_ -> Bool
True; FF
_ -> Bool
False }) BoundedPrim FF
build_CHC forall a b. (a -> b) -> a -> b
$
BoundedPrim FF
build_HC
build_CHL :: BoundedPrim FF
build_CHL = ( \ case CHL Word32
w -> ( forall a. a -> ((), a)
fstUnit (Word32 -> Word16
hi16 Word32
w), forall a. a -> ((), a)
fstUnit (Word32 -> Word16
lo16 Word32
w) )
FF
_ -> forall a. HasCallStack => a
undefined )
forall (f :: * -> *) b a. Contravariant f => (b -> a) -> f a -> f b
>$< (forall {b}. BoundedPrim b
colsep forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
>*< BoundedPrim Word16
P.word16Hex)
forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
>*< (forall {b}. BoundedPrim b
colsep forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
>*< BoundedPrim Word16
P.word16Hex)
build_HL :: BoundedPrim FF
build_HL = ( \ case HL Word32
w -> ( Word32 -> Word16
hi16 Word32
w, forall a. a -> ((), a)
fstUnit (Word32 -> Word16
lo16 Word32
w) )
FF
_ -> forall a. HasCallStack => a
undefined )
forall (f :: * -> *) b a. Contravariant f => (b -> a) -> f a -> f b
>$< BoundedPrim Word16
P.word16Hex forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
>*< forall {b}. BoundedPrim b
colsep forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
>*< BoundedPrim Word16
P.word16Hex
build_NOP :: BoundedPrim a
build_NOP = forall {b}. BoundedPrim b
P.emptyB
build_COL :: BoundedPrim b
build_COL = forall a b. a -> b -> a
const () forall (f :: * -> *) b a. Contravariant f => (b -> a) -> f a -> f b
>$< forall {b}. BoundedPrim b
colsep
build_CC :: BoundedPrim b
build_CC = forall a b. a -> b -> a
const ((), ()) forall (f :: * -> *) b a. Contravariant f => (b -> a) -> f a -> f b
>$< forall {b}. BoundedPrim b
colsep forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
>*< forall {b}. BoundedPrim b
colsep
build_CLO :: BoundedPrim FF
build_CLO = ( \ case CLO Word32
w -> forall a. a -> ((), a)
fstUnit (Word32 -> Word16
lo16 Word32
w)
FF
_ -> forall a. HasCallStack => a
undefined )
forall (f :: * -> *) b a. Contravariant f => (b -> a) -> f a -> f b
>$< forall {b}. BoundedPrim b
colsep forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
>*< BoundedPrim Word16
P.word16Hex
build_CHC :: BoundedPrim FF
build_CHC = ( \ case CHC Word32
w -> forall a. a -> ((), a)
fstUnit (forall a. a -> (a, ())
sndUnit (Word32 -> Word16
hi16 Word32
w))
FF
_ -> forall a. HasCallStack => a
undefined )
forall (f :: * -> *) b a. Contravariant f => (b -> a) -> f a -> f b
>$< forall {b}. BoundedPrim b
colsep forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
>*< BoundedPrim Word16
P.word16Hex forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
>*< forall {b}. BoundedPrim b
colsep
build_HC :: BoundedPrim FF
build_HC = ( \ case HC Word32
w -> forall a. a -> (a, ())
sndUnit (Word32 -> Word16
hi16 Word32
w)
FF
_ -> forall a. HasCallStack => a
undefined )
forall (f :: * -> *) b a. Contravariant f => (b -> a) -> f a -> f b
>$< BoundedPrim Word16
P.word16Hex forall (f :: * -> *) a b. Monoidal f => f a -> f b -> f (a, b)
>*< forall {b}. BoundedPrim b
colsep
colsep :: P.BoundedPrim a
colsep :: forall {b}. BoundedPrim b
colsep = forall a. FixedPrim a -> BoundedPrim a
toB forall a b. (a -> b) -> a -> b
$ forall a b. a -> b -> a
const Word8
0x3a forall (f :: * -> *) b a. Contravariant f => (b -> a) -> f a -> f b
>$< FixedPrim Word8
P.word8
ffff :: P.BoundedPrim a
ffff :: forall {b}. BoundedPrim b
ffff = forall a. FixedPrim a -> BoundedPrim a
toB forall a b. (a -> b) -> a -> b
$ forall a b. a -> b -> a
const Word16
0xffff forall (f :: * -> *) b a. Contravariant f => (b -> a) -> f a -> f b
>$< FixedPrim Word16
P.word16HexFixed
hi16, lo16 :: Word32 -> Word16
hi16 :: Word32 -> Word16
hi16 !(W32# Word32#
w) = Word16# -> Word16
W16# (Word# -> Word16#
wordToWord16Compat# (Word32# -> Word#
word32ToWordCompat# Word32#
w Word# -> Int# -> Word#
`uncheckedShiftRL#` Int#
16#))
lo16 :: Word32 -> Word16
lo16 !(W32# Word32#
w) = Word16# -> Word16
W16# (Word# -> Word16#
wordToWord16Compat# (Word32# -> Word#
word32ToWordCompat# Word32#
w Word# -> Word# -> Word#
`and#` Word#
0xffff##))
fstUnit :: a -> ((), a)
fstUnit :: forall a. a -> ((), a)
fstUnit = ((), )
sndUnit :: a -> (a, ())
sndUnit :: forall a. a -> (a, ())
sndUnit = (, ())
pairPair :: (a, b, a, b) -> ((a, b), (a, b))
pairPair (a
a, b
b, a
c, b
d) = ((a
a, b
b), (a
c, b
d))
genFields :: (Word32, Word32, Word32, Word32) -> ((FF, FF), (FF, FF))
genFields (Word32
w0, Word32
w1, Word32
w2, Word32
w3) =
let !(!Int
gapStart, !Int
gapEnd) = Word32 -> Word32 -> Word32 -> Word32 -> (Int, Int)
bestgap Word32
w0 Word32
w1 Word32
w2 Word32
w3
!f0 :: FF
f0 = Int -> Int -> Word32 -> FF
makeF0 Int
gapStart Int
gapEnd Word32
w0
!f1 :: FF
f1 = Int -> Int -> Int# -> Int# -> Word32 -> FF
makeF12 Int
gapStart Int
gapEnd Int#
2# Int#
3# Word32
w1
!f2 :: FF
f2 = Int -> Int -> Int# -> Int# -> Word32 -> FF
makeF12 Int
gapStart Int
gapEnd Int#
4# Int#
5# Word32
w2
!f3 :: FF
f3 = Int -> Int -> Word32 -> FF
makeF3 Int
gapStart Int
gapEnd Word32
w3
in ((FF
f0, FF
f1), (FF
f2, FF
f3))
makeF0 :: Int -> Int -> Word32 -> FF
makeF0 (I# Int#
gapStart) (I# Int#
gapEnd) !Word32
w =
case (Int#
gapEnd Int# -> Int# -> Int#
==# Int#
0#) Int# -> Int# -> Int#
`orI#` (Int#
gapStart Int# -> Int# -> Int#
># Int#
1#) of
Int#
1# -> Word32 -> FF
HL Word32
w
Int#
_ -> case Int#
gapStart Int# -> Int# -> Int#
==# Int#
0# of
Int#
1# -> FF
COL
Int#
_ -> Word32 -> FF
HC Word32
w
{-# INLINE makeF0 #-}
makeF12 :: Int -> Int -> Int# -> Int# -> Word32 -> FF
makeF12 (I# Int#
gapStart) (I# Int#
gapEnd) Int#
il Int#
ir !Word32
w =
case (Int#
gapEnd Int# -> Int# -> Int#
<=# Int#
il) Int# -> Int# -> Int#
`orI#` (Int#
gapStart Int# -> Int# -> Int#
># Int#
ir) of
Int#
1# -> Word32 -> FF
CHL Word32
w
Int#
_ -> case Int#
gapStart Int# -> Int# -> Int#
>=# Int#
il of
Int#
1# -> case Int#
gapStart Int# -> Int# -> Int#
==# Int#
il of
Int#
1# -> FF
COL
Int#
_ -> Word32 -> FF
CHC Word32
w
Int#
_ -> case Int#
gapEnd Int# -> Int# -> Int#
==# Int#
ir of
Int#
0# -> FF
NOP
Int#
_ -> Word32 -> FF
CLO Word32
w
{-# INLINE makeF12 #-}
makeF3 :: Int -> Int -> Word32 -> FF
makeF3 (I# Int#
gapStart) (I# Int#
gapEnd) !Word32
w =
case Int#
gapEnd Int# -> Int# -> Int#
<=# Int#
6# of
Int#
1# -> Word32 -> FF
CHL Word32
w
Int#
_ -> case Int#
gapStart Int# -> Int# -> Int#
==# Int#
6# of
Int#
0# -> case Int#
gapEnd Int# -> Int# -> Int#
==# Int#
8# of
Int#
1# -> FF
COL
Int#
_ -> Word32 -> FF
CLO Word32
w
Int#
_ -> FF
CC
{-# INLINE makeF3 #-}
bestgap :: Word32 -> Word32 -> Word32 -> Word32 -> (Int, Int)
bestgap :: Word32 -> Word32 -> Word32 -> Word32 -> (Int, Int)
bestgap !(W32# Word32#
a0) !(W32# Word32#
a1) !(W32# Word32#
a2) !(W32# Word32#
a3) =
Int# -> (Int, Int)
finalGap
(Word# -> Int# -> Int#
updateGap (Word#
0xffff## Word# -> Word# -> Word#
`and#` (Word32# -> Word#
word32ToWordCompat# Word32#
a3))
(Word# -> Int# -> Int#
updateGap (Word#
0xffff0000## Word# -> Word# -> Word#
`and#` (Word32# -> Word#
word32ToWordCompat# Word32#
a3))
(Word# -> Int# -> Int#
updateGap (Word#
0xffff## Word# -> Word# -> Word#
`and#` (Word32# -> Word#
word32ToWordCompat# Word32#
a2))
(Word# -> Int# -> Int#
updateGap (Word#
0xffff0000## Word# -> Word# -> Word#
`and#` (Word32# -> Word#
word32ToWordCompat# Word32#
a2))
(Word# -> Int# -> Int#
updateGap (Word#
0xffff## Word# -> Word# -> Word#
`and#` (Word32# -> Word#
word32ToWordCompat# Word32#
a1))
(Word# -> Int# -> Int#
updateGap (Word#
0xffff0000## Word# -> Word# -> Word#
`and#` (Word32# -> Word#
word32ToWordCompat# Word32#
a1))
(Word# -> Int# -> Int#
updateGap (Word#
0xffff## Word# -> Word# -> Word#
`and#` (Word32# -> Word#
word32ToWordCompat# Word32#
a0))
(Word# -> Int#
initGap (Word#
0xffff0000## Word# -> Word# -> Word#
`and#` (Word32# -> Word#
word32ToWordCompat# Word32#
a0))))))))))
where
initGap :: Word# -> Int#
initGap :: Word# -> Int#
initGap Word#
w = case Word#
w of { Word#
0## -> Int#
0x1717#; Word#
_ -> Int#
0x0707# }
updateGap :: Word# -> Int# -> Int#
updateGap :: Word# -> Int# -> Int#
updateGap Word#
w Int#
g = case Word#
w Word# -> Word# -> Int#
`neWord#` Word#
0## of
Int#
1# -> (Int#
g Int# -> Int# -> Int#
+# Int#
0xffff#) Int# -> Int# -> Int#
`andI#` Int#
0xff0f#
Int#
_ -> let old :: Int#
old = Int#
g Int# -> Int# -> Int#
+# Int#
0xf#
zi :: Int#
zi = Int#
old Int# -> Int# -> Int#
`andI#` Int#
0xff#
new :: Int#
new = (Int#
zi Int# -> Int# -> Int#
`uncheckedIShiftL#` Int#
8#) Int# -> Int# -> Int#
`orI#` Int#
zi
in case Int#
new Int# -> Int# -> Int#
># Int#
old of
Int#
1# -> Int#
new
Int#
_ -> Int#
old
finalGap :: Int# -> (Int, Int)
finalGap :: Int# -> (Int, Int)
finalGap Int#
i =
let g :: Int#
g = Int#
i Int# -> Int# -> Int#
`uncheckedIShiftRL#` Int#
12#
in case Int#
g Int# -> Int# -> Int#
<# Int#
2# of
Int#
1# -> (Int
0, Int
0)
Int#
_ -> let e :: Int#
e = Int#
8# Int# -> Int# -> Int#
-# ((Int#
i Int# -> Int# -> Int#
`uncheckedIShiftRL#` Int#
8#) Int# -> Int# -> Int#
`andI#` Int#
0xf#)
s :: Int#
s = Int#
e Int# -> Int# -> Int#
-# Int#
g
in (Int# -> Int
I# Int#
s, Int# -> Int
I# Int#
e)
{-# INLINE bestgap #-}
#if MIN_VERSION_base(4,16,0)
word32ToWordCompat# :: Word32# -> Word#
word32ToWordCompat# :: Word32# -> Word#
word32ToWordCompat# = Word32# -> Word#
word32ToWord#
wordToWord8Compat# :: Word# -> Word8#
wordToWord8Compat# :: Word# -> Word8#
wordToWord8Compat# = Word# -> Word8#
wordToWord8#
wordToWord16Compat# :: Word# -> Word16#
wordToWord16Compat# :: Word# -> Word16#
wordToWord16Compat# = Word# -> Word16#
wordToWord16#
#else
word32ToWordCompat# :: Word# -> Word#
word32ToWordCompat# x = x
wordToWord8Compat# :: Word# -> Word#
wordToWord8Compat# x = x
wordToWord16Compat# :: Word# -> Word#
wordToWord16Compat# x = x
#endif