-- !!! Test file positioning

module Main(main) where

import Control.Monad
import System.Directory (removeFile, doesFileExist)
import System.IO
import System.IO.Error

main = do
  hIn <- openFile "hGetPosn001.in" ReadMode
  f <- doesFileExist "hGetPosn001.out"
  when f (removeFile "hGetPosn001.out")
  hOut <- openFile "hGetPosn001.out" ReadWriteMode
  bof <- hGetPosn hIn
  putStrLn (show bof)  -- you can show HandlePosns
  copy hIn hOut
  hSetPosn bof
  copy hIn hOut
  hSeek hOut AbsoluteSeek 0
  stuff <- hGetContents hOut
  putStr stuff

copy :: Handle -> Handle -> IO ()
copy hIn hOut =
    tryIOError (hGetChar hIn) >>=
    either (\ err -> if isEOFError err then return () else error "copy")
           ( \ x -> hPutChar hOut x >> copy hIn hOut)
