{-# LANGUAGE MagicHash,UnboxedTuples #-}
module Data.Util.Size
       ( unsafeSizeof
       , strictUnsafeSizeof
       )where

import GHC.Exts
import Foreign

unsafeSizeof :: a -> Int
unsafeSizeof a =
  case unpackClosure# a of
    (# x, ptrs, nptrs #) ->
      sizeOf header + 
      I# (sizeofByteArray# (unsafeCoerce# ptrs) +# 
          sizeofByteArray# nptrs)
  where
    header :: Int
    header = undefined

strictUnsafeSizeof :: a -> Int
strictUnsafeSizeof = (unsafeSizeof $!)