content: {-# LANGUAGE MagicHash #-}
  {-# LANGUAGE BangPatterns #-}
  
  module Main where
  
  import Language.Haskell.TH.Lib
  import GHC.Ptr
  import Foreign.ForeignPtr
  
  main :: IO ()
  main = do
  
     let
        !x = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"#
        !y = "ABCDEabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"#
  
     p1 <- newForeignPtr_ (Ptr x)
     p2 <- newForeignPtr_ (Ptr y)
  
     let
        b1 = mkBytes p1  0 5
        b2 = mkBytes p1 10 5
        b3 = mkBytes p1 26 5
        b4 = mkBytes p2  5 5
        b5 = mkBytes p2 10 5
  
     let myCmp a b = putStrLn $ "compare " ++ show a ++ " to " ++ show b ++ " => " ++ show (compare a b)
  
     putStr "same pointer, same offset, same bytes: "
     myCmp b1 b1
     putStr "same pointer, different offset, same bytes: "
     myCmp b1 b3
     putStr "same pointer, different offset, different bytes: "
     myCmp b1 b2
     putStr "same pointer, different offset, different bytes: "
     myCmp b2 b1
     putStr "different pointer, different offset, same bytes: "
     myCmp b1 b4
     putStr "different pointer, different offset, different bytes: "
     myCmp b1 b5
  