{-# LANGUAGE UnboxedSums, MagicHash, UnboxedTuples #-} module Lib where import GHC.Exts data B = B1 Int# Int# Int# Int# Int# | B2 Float# type UbxB = (# (# Int#, Int#, Int#, Int#, Int# #) | Float# #) {-# INLINE bToSum #-} bToSum :: B -> UbxB bToSum (B1 i1 i2 i3 i4 i5) = (# (# i1, i2, i3, i4, i5 #) | #) bToSum (B2 f) = (# | f #) data C = C UbxB UbxB UbxB mkC :: B -> C mkC b = C (bToSum b) (bToSum b) (bToSum b)