content: module Main where
  
  import Control.Exception
  import System.Mem
  
  import GHC.Compact
  
  assertFail :: String -> IO ()
  assertFail msg = throwIO $ AssertionFailed msg
  
  assertEquals :: (Eq a, Show a) => a -> a -> IO ()
  assertEquals expected actual =
    if expected == actual then return ()
    else assertFail $ "expected " ++ (show expected)
         ++ ", got " ++ (show actual)
  
  main = do
    let val = ("hello", Just 42) :: (String, Maybe Int)
    str <- compactWithSharing val
  
    let val2 = ("world", 42) :: (String, Int)
    str2 <- compactAddWithSharing str val2
  
    -- check that values where not corrupted
    assertEquals ("hello", Just 42) val
    assertEquals ("world", 42) val2
    -- check the values in the compact
    assertEquals ("hello", Just 42) (getCompact str)
    assertEquals ("world", 42) (getCompact str2)
  
    performMajorGC
  
    -- same checks again
    assertEquals ("hello", Just 42) val
    assertEquals ("world", 42) val2
    -- check the values in the compact
    assertEquals ("hello", Just 42) (getCompact str)
    assertEquals ("world", 42) (getCompact str2)
  