Sophie

Sophie

distrib > Fedora > 15 > i386 > by-pkgid > f9b127c02f56e71454a7233185e51eb4 > files > 858

ghc-base-devel-4.3.1.0-16.fc15.i686.rpm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->
<title>GHC/IO/Handle.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>{-# OPTIONS_GHC -fno-warn-unused-matches #-}</span>
<a name="line-2"></a><span class='hs-comment'>{-# LANGUAGE NoImplicitPrelude, RecordWildCards #-}</span>
<a name="line-3"></a>
<a name="line-4"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-5"></a><span class='hs-comment'>-- |</span>
<a name="line-6"></a><span class='hs-comment'>-- Module      :  GHC.IO.Handle</span>
<a name="line-7"></a><span class='hs-comment'>-- Copyright   :  (c) The University of Glasgow, 1994-2009</span>
<a name="line-8"></a><span class='hs-comment'>-- License     :  see libraries/base/LICENSE</span>
<a name="line-9"></a><span class='hs-comment'>-- </span>
<a name="line-10"></a><span class='hs-comment'>-- Maintainer  :  libraries@haskell.org</span>
<a name="line-11"></a><span class='hs-comment'>-- Stability   :  provisional</span>
<a name="line-12"></a><span class='hs-comment'>-- Portability :  non-portable</span>
<a name="line-13"></a><span class='hs-comment'>--</span>
<a name="line-14"></a><span class='hs-comment'>-- External API for GHC's Handle implementation</span>
<a name="line-15"></a><span class='hs-comment'>--</span>
<a name="line-16"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-17"></a>
<a name="line-18"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span><span class='hs-varop'>.</span><span class='hs-conid'>Handle</span> <span class='hs-layout'>(</span>
<a name="line-19"></a>   <span class='hs-conid'>Handle</span><span class='hs-layout'>,</span>
<a name="line-20"></a>   <span class='hs-conid'>BufferMode</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-21"></a> 
<a name="line-22"></a>   <span class='hs-varid'>mkFileHandle</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkDuplexHandle</span><span class='hs-layout'>,</span>
<a name="line-23"></a> 
<a name="line-24"></a>   <span class='hs-varid'>hFileSize</span><span class='hs-layout'>,</span> <span class='hs-varid'>hSetFileSize</span><span class='hs-layout'>,</span> <span class='hs-varid'>hIsEOF</span><span class='hs-layout'>,</span> <span class='hs-varid'>hLookAhead</span><span class='hs-layout'>,</span>
<a name="line-25"></a>   <span class='hs-varid'>hSetBuffering</span><span class='hs-layout'>,</span> <span class='hs-varid'>hSetBinaryMode</span><span class='hs-layout'>,</span> <span class='hs-varid'>hSetEncoding</span><span class='hs-layout'>,</span> <span class='hs-varid'>hGetEncoding</span><span class='hs-layout'>,</span>
<a name="line-26"></a>   <span class='hs-varid'>hFlush</span><span class='hs-layout'>,</span> <span class='hs-varid'>hFlushAll</span><span class='hs-layout'>,</span> <span class='hs-varid'>hDuplicate</span><span class='hs-layout'>,</span> <span class='hs-varid'>hDuplicateTo</span><span class='hs-layout'>,</span>
<a name="line-27"></a> 
<a name="line-28"></a>   <span class='hs-varid'>hClose</span><span class='hs-layout'>,</span> <span class='hs-varid'>hClose_help</span><span class='hs-layout'>,</span>
<a name="line-29"></a> 
<a name="line-30"></a>   <span class='hs-conid'>HandlePosition</span><span class='hs-layout'>,</span> <span class='hs-conid'>HandlePosn</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>hGetPosn</span><span class='hs-layout'>,</span> <span class='hs-varid'>hSetPosn</span><span class='hs-layout'>,</span>
<a name="line-31"></a>   <span class='hs-conid'>SeekMode</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>hSeek</span><span class='hs-layout'>,</span> <span class='hs-varid'>hTell</span><span class='hs-layout'>,</span>
<a name="line-32"></a> 
<a name="line-33"></a>   <span class='hs-varid'>hIsOpen</span><span class='hs-layout'>,</span> <span class='hs-varid'>hIsClosed</span><span class='hs-layout'>,</span> <span class='hs-varid'>hIsReadable</span><span class='hs-layout'>,</span> <span class='hs-varid'>hIsWritable</span><span class='hs-layout'>,</span> <span class='hs-varid'>hGetBuffering</span><span class='hs-layout'>,</span> <span class='hs-varid'>hIsSeekable</span><span class='hs-layout'>,</span>
<a name="line-34"></a>   <span class='hs-varid'>hSetEcho</span><span class='hs-layout'>,</span> <span class='hs-varid'>hGetEcho</span><span class='hs-layout'>,</span> <span class='hs-varid'>hIsTerminalDevice</span><span class='hs-layout'>,</span>
<a name="line-35"></a> 
<a name="line-36"></a>   <span class='hs-varid'>hSetNewlineMode</span><span class='hs-layout'>,</span> <span class='hs-conid'>Newline</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>NewlineMode</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>nativeNewline</span><span class='hs-layout'>,</span>
<a name="line-37"></a>   <span class='hs-varid'>noNewlineTranslation</span><span class='hs-layout'>,</span> <span class='hs-varid'>universalNewlineMode</span><span class='hs-layout'>,</span> <span class='hs-varid'>nativeNewlineMode</span><span class='hs-layout'>,</span>
<a name="line-38"></a>
<a name="line-39"></a>   <span class='hs-varid'>hShow</span><span class='hs-layout'>,</span>
<a name="line-40"></a>
<a name="line-41"></a>   <span class='hs-varid'>hWaitForInput</span><span class='hs-layout'>,</span> <span class='hs-varid'>hGetChar</span><span class='hs-layout'>,</span> <span class='hs-varid'>hGetLine</span><span class='hs-layout'>,</span> <span class='hs-varid'>hGetContents</span><span class='hs-layout'>,</span> <span class='hs-varid'>hPutChar</span><span class='hs-layout'>,</span> <span class='hs-varid'>hPutStr</span><span class='hs-layout'>,</span>
<a name="line-42"></a>
<a name="line-43"></a>   <span class='hs-varid'>hGetBuf</span><span class='hs-layout'>,</span> <span class='hs-varid'>hGetBufNonBlocking</span><span class='hs-layout'>,</span> <span class='hs-varid'>hPutBuf</span><span class='hs-layout'>,</span> <span class='hs-varid'>hPutBufNonBlocking</span>
<a name="line-44"></a> <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-45"></a>
<a name="line-46"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span>
<a name="line-47"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span><span class='hs-varop'>.</span><span class='hs-conid'>Exception</span>
<a name="line-48"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span><span class='hs-varop'>.</span><span class='hs-conid'>Encoding</span>
<a name="line-49"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span><span class='hs-varop'>.</span><span class='hs-conid'>Buffer</span>
<a name="line-50"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span><span class='hs-varop'>.</span><span class='hs-conid'>BufferedIO</span> <span class='hs-layout'>(</span> <span class='hs-conid'>BufferedIO</span> <span class='hs-layout'>)</span>
<a name="line-51"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span><span class='hs-varop'>.</span><span class='hs-conid'>Device</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>IODevice</span>
<a name="line-52"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span><span class='hs-varop'>.</span><span class='hs-conid'>Handle</span><span class='hs-varop'>.</span><span class='hs-conid'>Types</span>
<a name="line-53"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span><span class='hs-varop'>.</span><span class='hs-conid'>Handle</span><span class='hs-varop'>.</span><span class='hs-conid'>Internals</span>
<a name="line-54"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span><span class='hs-varop'>.</span><span class='hs-conid'>Handle</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span>
<a name="line-55"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span><span class='hs-varop'>.</span><span class='hs-conid'>BufferedIO</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>Buffered</span>
<a name="line-56"></a>
<a name="line-57"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>Base</span>
<a name="line-58"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>Exception</span>
<a name="line-59"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>MVar</span>
<a name="line-60"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>IORef</span>
<a name="line-61"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>Show</span>
<a name="line-62"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>Num</span>
<a name="line-63"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>Real</span>
<a name="line-64"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Maybe</span>
<a name="line-65"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Typeable</span>
<a name="line-66"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span>
<a name="line-67"></a>
<a name="line-68"></a><span class='hs-comment'>-- ---------------------------------------------------------------------------</span>
<a name="line-69"></a><span class='hs-comment'>-- Closing a handle</span>
<a name="line-70"></a>
<a name="line-71"></a><span class='hs-comment'>-- | Computation 'hClose' @hdl@ makes handle @hdl@ closed.  Before the</span>
<a name="line-72"></a><span class='hs-comment'>-- computation finishes, if @hdl@ is writable its buffer is flushed as</span>
<a name="line-73"></a><span class='hs-comment'>-- for 'hFlush'.</span>
<a name="line-74"></a><span class='hs-comment'>-- Performing 'hClose' on a handle that has already been closed has no effect; </span>
<a name="line-75"></a><span class='hs-comment'>-- doing so is not an error.  All other operations on a closed handle will fail.</span>
<a name="line-76"></a><span class='hs-comment'>-- If 'hClose' fails for any reason, any further operations (apart from</span>
<a name="line-77"></a><span class='hs-comment'>-- 'hClose') on the handle will still fail as if @hdl@ had been successfully</span>
<a name="line-78"></a><span class='hs-comment'>-- closed.</span>
<a name="line-79"></a>
<a name="line-80"></a><a name="hClose"></a><span class='hs-definition'>hClose</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-81"></a><span class='hs-definition'>hClose</span> <span class='hs-varid'>h</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>FileHandle</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> 
<a name="line-82"></a>  <span class='hs-varid'>mb_exc</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>hClose'</span> <span class='hs-varid'>h</span> <span class='hs-varid'>m</span>
<a name="line-83"></a>  <span class='hs-varid'>hClose_maybethrow</span> <span class='hs-varid'>mb_exc</span> <span class='hs-varid'>h</span>
<a name="line-84"></a><span class='hs-definition'>hClose</span> <span class='hs-varid'>h</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>DuplexHandle</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>r</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-85"></a>  <span class='hs-varid'>excs</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-layout'>(</span><span class='hs-varid'>hClose'</span> <span class='hs-varid'>h</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>w</span><span class='hs-keyglyph'>]</span>
<a name="line-86"></a>  <span class='hs-varid'>hClose_maybethrow</span> <span class='hs-layout'>(</span><span class='hs-varid'>listToMaybe</span> <span class='hs-layout'>(</span><span class='hs-varid'>catMaybes</span> <span class='hs-varid'>excs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>h</span>
<a name="line-87"></a>
<a name="line-88"></a><a name="hClose_maybethrow"></a><span class='hs-definition'>hClose_maybethrow</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>SomeException</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-89"></a><span class='hs-definition'>hClose_maybethrow</span> <span class='hs-conid'>Nothing</span>  <span class='hs-varid'>h</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-90"></a><span class='hs-definition'>hClose_maybethrow</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-varid'>h</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hClose_rethrow</span> <span class='hs-varid'>e</span> <span class='hs-varid'>h</span>
<a name="line-91"></a>
<a name="line-92"></a><a name="hClose_rethrow"></a><span class='hs-definition'>hClose_rethrow</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SomeException</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-93"></a><span class='hs-definition'>hClose_rethrow</span> <span class='hs-varid'>e</span> <span class='hs-varid'>h</span> <span class='hs-keyglyph'>=</span> 
<a name="line-94"></a>  <span class='hs-keyword'>case</span> <span class='hs-varid'>fromException</span> <span class='hs-varid'>e</span> <span class='hs-keyword'>of</span>
<a name="line-95"></a>    <span class='hs-conid'>Just</span> <span class='hs-varid'>ioe</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ioError</span> <span class='hs-layout'>(</span><span class='hs-varid'>augmentIOError</span> <span class='hs-varid'>ioe</span> <span class='hs-str'>"hClose"</span> <span class='hs-varid'>h</span><span class='hs-layout'>)</span>
<a name="line-96"></a>    <span class='hs-conid'>Nothing</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>throwIO</span> <span class='hs-varid'>e</span>
<a name="line-97"></a>
<a name="line-98"></a><a name="hClose'"></a><span class='hs-definition'>hClose'</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>MVar</span> <span class='hs-conid'>Handle__</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>SomeException</span><span class='hs-layout'>)</span>
<a name="line-99"></a><span class='hs-definition'>hClose'</span> <span class='hs-varid'>h</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withHandle'</span> <span class='hs-str'>"hClose"</span> <span class='hs-varid'>h</span> <span class='hs-varid'>m</span> <span class='hs-varop'>$</span> <span class='hs-varid'>hClose_help</span>
<a name="line-100"></a>
<a name="line-101"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-102"></a><span class='hs-comment'>-- Detecting and changing the size of a file</span>
<a name="line-103"></a>
<a name="line-104"></a><span class='hs-comment'>-- | For a handle @hdl@ which attached to a physical file,</span>
<a name="line-105"></a><span class='hs-comment'>-- 'hFileSize' @hdl@ returns the size of that file in 8-bit bytes.</span>
<a name="line-106"></a>
<a name="line-107"></a><a name="hFileSize"></a><span class='hs-definition'>hFileSize</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Integer</span>
<a name="line-108"></a><span class='hs-definition'>hFileSize</span> <span class='hs-varid'>handle</span> <span class='hs-keyglyph'>=</span>
<a name="line-109"></a>    <span class='hs-varid'>withHandle_</span> <span class='hs-str'>"hFileSize"</span> <span class='hs-varid'>handle</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>handle_</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>Handle__</span><span class='hs-layout'>{</span><span class='hs-varid'>haDevice</span><span class='hs-keyglyph'>=</span><span class='hs-varid'>dev</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-110"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>haType</span> <span class='hs-varid'>handle_</span> <span class='hs-keyword'>of</span> 
<a name="line-111"></a>      <span class='hs-conid'>ClosedHandle</span>              <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ioe_closedHandle</span>
<a name="line-112"></a>      <span class='hs-conid'>SemiClosedHandle</span>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ioe_closedHandle</span>
<a name="line-113"></a>      <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>flushWriteBuffer</span> <span class='hs-varid'>handle_</span>
<a name="line-114"></a>              <span class='hs-varid'>r</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>IODevice</span><span class='hs-varop'>.</span><span class='hs-varid'>getSize</span> <span class='hs-varid'>dev</span>
<a name="line-115"></a>              <span class='hs-keyword'>if</span> <span class='hs-varid'>r</span> <span class='hs-varop'>/=</span> <span class='hs-comment'>-</span><span class='hs-num'>1</span>
<a name="line-116"></a>                 <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-varid'>r</span>
<a name="line-117"></a>                 <span class='hs-keyword'>else</span> <span class='hs-varid'>ioException</span> <span class='hs-layout'>(</span><span class='hs-conid'>IOError</span> <span class='hs-conid'>Nothing</span> <span class='hs-conid'>InappropriateType</span> <span class='hs-str'>"hFileSize"</span>
<a name="line-118"></a>                                   <span class='hs-str'>"not a regular file"</span> <span class='hs-conid'>Nothing</span> <span class='hs-conid'>Nothing</span><span class='hs-layout'>)</span>
<a name="line-119"></a>
<a name="line-120"></a>
<a name="line-121"></a><span class='hs-comment'>-- | 'hSetFileSize' @hdl@ @size@ truncates the physical file with handle @hdl@ to @size@ bytes.</span>
<a name="line-122"></a>
<a name="line-123"></a><a name="hSetFileSize"></a><span class='hs-definition'>hSetFileSize</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Integer</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-124"></a><span class='hs-definition'>hSetFileSize</span> <span class='hs-varid'>handle</span> <span class='hs-varid'>size</span> <span class='hs-keyglyph'>=</span>
<a name="line-125"></a>    <span class='hs-varid'>withHandle_</span> <span class='hs-str'>"hSetFileSize"</span> <span class='hs-varid'>handle</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>handle_</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>Handle__</span><span class='hs-layout'>{</span><span class='hs-varid'>haDevice</span><span class='hs-keyglyph'>=</span><span class='hs-varid'>dev</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-126"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>haType</span> <span class='hs-varid'>handle_</span> <span class='hs-keyword'>of</span> 
<a name="line-127"></a>      <span class='hs-conid'>ClosedHandle</span>              <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ioe_closedHandle</span>
<a name="line-128"></a>      <span class='hs-conid'>SemiClosedHandle</span>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ioe_closedHandle</span>
<a name="line-129"></a>      <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>flushWriteBuffer</span> <span class='hs-varid'>handle_</span>
<a name="line-130"></a>              <span class='hs-conid'>IODevice</span><span class='hs-varop'>.</span><span class='hs-varid'>setSize</span> <span class='hs-varid'>dev</span> <span class='hs-varid'>size</span>
<a name="line-131"></a>              <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-132"></a>
<a name="line-133"></a><span class='hs-comment'>-- ---------------------------------------------------------------------------</span>
<a name="line-134"></a><span class='hs-comment'>-- Detecting the End of Input</span>
<a name="line-135"></a>
<a name="line-136"></a><span class='hs-comment'>-- | For a readable handle @hdl@, 'hIsEOF' @hdl@ returns</span>
<a name="line-137"></a><span class='hs-comment'>-- 'True' if no further input can be taken from @hdl@ or for a</span>
<a name="line-138"></a><span class='hs-comment'>-- physical file, if the current I\/O position is equal to the length of</span>
<a name="line-139"></a><span class='hs-comment'>-- the file.  Otherwise, it returns 'False'.</span>
<a name="line-140"></a><span class='hs-comment'>--</span>
<a name="line-141"></a><span class='hs-comment'>-- NOTE: 'hIsEOF' may block, because it has to attempt to read from</span>
<a name="line-142"></a><span class='hs-comment'>-- the stream to determine whether there is any more data to be read.</span>
<a name="line-143"></a>
<a name="line-144"></a><a name="hIsEOF"></a><span class='hs-definition'>hIsEOF</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Bool</span>
<a name="line-145"></a><span class='hs-definition'>hIsEOF</span> <span class='hs-varid'>handle</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wantReadableHandle_</span> <span class='hs-str'>"hIsEOF"</span> <span class='hs-varid'>handle</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-conid'>Handle__</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-146"></a>
<a name="line-147"></a>  <span class='hs-varid'>cbuf</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>readIORef</span> <span class='hs-varid'>haCharBuffer</span>
<a name="line-148"></a>  <span class='hs-keyword'>if</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>isEmptyBuffer</span> <span class='hs-varid'>cbuf</span><span class='hs-layout'>)</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-conid'>False</span> <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span>
<a name="line-149"></a>
<a name="line-150"></a>  <span class='hs-varid'>bbuf</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>readIORef</span> <span class='hs-varid'>haByteBuffer</span>
<a name="line-151"></a>  <span class='hs-keyword'>if</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>isEmptyBuffer</span> <span class='hs-varid'>bbuf</span><span class='hs-layout'>)</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-conid'>False</span> <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span>
<a name="line-152"></a>
<a name="line-153"></a>  <span class='hs-comment'>-- NB. do no decoding, just fill the byte buffer; see #3808</span>
<a name="line-154"></a>  <span class='hs-layout'>(</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span><span class='hs-varid'>bbuf'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>Buffered</span><span class='hs-varop'>.</span><span class='hs-varid'>fillReadBuffer</span> <span class='hs-varid'>haDevice</span> <span class='hs-varid'>bbuf</span>
<a name="line-155"></a>  <span class='hs-keyword'>if</span> <span class='hs-varid'>r</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span>
<a name="line-156"></a>     <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-conid'>True</span>
<a name="line-157"></a>     <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>writeIORef</span> <span class='hs-varid'>haByteBuffer</span> <span class='hs-varid'>bbuf'</span>
<a name="line-158"></a>             <span class='hs-varid'>return</span> <span class='hs-conid'>False</span>
<a name="line-159"></a>
<a name="line-160"></a><span class='hs-comment'>-- ---------------------------------------------------------------------------</span>
<a name="line-161"></a><span class='hs-comment'>-- Looking ahead</span>
<a name="line-162"></a>
<a name="line-163"></a><span class='hs-comment'>-- | Computation 'hLookAhead' returns the next character from the handle</span>
<a name="line-164"></a><span class='hs-comment'>-- without removing it from the input buffer, blocking until a character</span>
<a name="line-165"></a><span class='hs-comment'>-- is available.</span>
<a name="line-166"></a><span class='hs-comment'>--</span>
<a name="line-167"></a><span class='hs-comment'>-- This operation may fail with:</span>
<a name="line-168"></a><span class='hs-comment'>--</span>
<a name="line-169"></a><span class='hs-comment'>--  * 'isEOFError' if the end of file has been reached.</span>
<a name="line-170"></a>
<a name="line-171"></a><a name="hLookAhead"></a><span class='hs-definition'>hLookAhead</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Char</span>
<a name="line-172"></a><span class='hs-definition'>hLookAhead</span> <span class='hs-varid'>handle</span> <span class='hs-keyglyph'>=</span>
<a name="line-173"></a>  <span class='hs-varid'>wantReadableHandle_</span> <span class='hs-str'>"hLookAhead"</span>  <span class='hs-varid'>handle</span> <span class='hs-varid'>hLookAhead_</span>
<a name="line-174"></a>
<a name="line-175"></a><span class='hs-comment'>-- ---------------------------------------------------------------------------</span>
<a name="line-176"></a><span class='hs-comment'>-- Buffering Operations</span>
<a name="line-177"></a>
<a name="line-178"></a><span class='hs-comment'>-- Three kinds of buffering are supported: line-buffering,</span>
<a name="line-179"></a><span class='hs-comment'>-- block-buffering or no-buffering.  See GHC.IO.Handle for definition and</span>
<a name="line-180"></a><span class='hs-comment'>-- further explanation of what the type represent.</span>
<a name="line-181"></a>
<a name="line-182"></a><span class='hs-comment'>-- | Computation 'hSetBuffering' @hdl mode@ sets the mode of buffering for</span>
<a name="line-183"></a><span class='hs-comment'>-- handle @hdl@ on subsequent reads and writes.</span>
<a name="line-184"></a><span class='hs-comment'>--</span>
<a name="line-185"></a><span class='hs-comment'>-- If the buffer mode is changed from 'BlockBuffering' or</span>
<a name="line-186"></a><span class='hs-comment'>-- 'LineBuffering' to 'NoBuffering', then</span>
<a name="line-187"></a><span class='hs-comment'>--</span>
<a name="line-188"></a><span class='hs-comment'>--  * if @hdl@ is writable, the buffer is flushed as for 'hFlush';</span>
<a name="line-189"></a><span class='hs-comment'>--</span>
<a name="line-190"></a><span class='hs-comment'>--  * if @hdl@ is not writable, the contents of the buffer is discarded.</span>
<a name="line-191"></a><span class='hs-comment'>--</span>
<a name="line-192"></a><span class='hs-comment'>-- This operation may fail with:</span>
<a name="line-193"></a><span class='hs-comment'>--</span>
<a name="line-194"></a><span class='hs-comment'>--  * 'isPermissionError' if the handle has already been used for reading</span>
<a name="line-195"></a><span class='hs-comment'>--    or writing and the implementation does not allow the buffering mode</span>
<a name="line-196"></a><span class='hs-comment'>--    to be changed.</span>
<a name="line-197"></a>
<a name="line-198"></a><a name="hSetBuffering"></a><span class='hs-definition'>hSetBuffering</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>BufferMode</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-199"></a><span class='hs-definition'>hSetBuffering</span> <span class='hs-varid'>handle</span> <span class='hs-varid'>mode</span> <span class='hs-keyglyph'>=</span>
<a name="line-200"></a>  <span class='hs-varid'>withAllHandles__</span> <span class='hs-str'>"hSetBuffering"</span> <span class='hs-varid'>handle</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>handle_</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>Handle__</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-201"></a>  <span class='hs-keyword'>case</span> <span class='hs-varid'>haType</span> <span class='hs-keyword'>of</span>
<a name="line-202"></a>    <span class='hs-conid'>ClosedHandle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ioe_closedHandle</span>
<a name="line-203"></a>    <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-204"></a>         <span class='hs-keyword'>if</span> <span class='hs-varid'>mode</span> <span class='hs-varop'>==</span> <span class='hs-varid'>haBufferMode</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-varid'>handle_</span> <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span>
<a name="line-205"></a>
<a name="line-206"></a>         <span class='hs-comment'>-- See [note Buffer Sizing] in GHC.IO.Handle.Types</span>
<a name="line-207"></a>
<a name="line-208"></a>          <span class='hs-comment'>-- check for errors:</span>
<a name="line-209"></a>          <span class='hs-keyword'>case</span> <span class='hs-varid'>mode</span> <span class='hs-keyword'>of</span>
<a name="line-210"></a>              <span class='hs-conid'>BlockBuffering</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>n</span> <span class='hs-varop'>&lt;=</span> <span class='hs-num'>0</span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ioe_bufsiz</span> <span class='hs-varid'>n</span>
<a name="line-211"></a>              <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-212"></a>
<a name="line-213"></a>          <span class='hs-comment'>-- for input terminals we need to put the terminal into</span>
<a name="line-214"></a>          <span class='hs-comment'>-- cooked or raw mode depending on the type of buffering.</span>
<a name="line-215"></a>          <span class='hs-varid'>is_tty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>IODevice</span><span class='hs-varop'>.</span><span class='hs-varid'>isTerminal</span> <span class='hs-varid'>haDevice</span>
<a name="line-216"></a>          <span class='hs-varid'>when</span> <span class='hs-layout'>(</span><span class='hs-varid'>is_tty</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>isReadableHandleType</span> <span class='hs-varid'>haType</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span>
<a name="line-217"></a>                <span class='hs-keyword'>case</span> <span class='hs-varid'>mode</span> <span class='hs-keyword'>of</span>
<a name="line-218"></a><span class='hs-cpp'>#ifndef mingw32_HOST_OS</span>
<a name="line-219"></a>        <span class='hs-comment'>-- 'raw' mode under win32 is a bit too specialised (and troublesome</span>
<a name="line-220"></a>        <span class='hs-comment'>-- for most common uses), so simply disable its use here.</span>
<a name="line-221"></a>                  <span class='hs-conid'>NoBuffering</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IODevice</span><span class='hs-varop'>.</span><span class='hs-varid'>setRaw</span> <span class='hs-varid'>haDevice</span> <span class='hs-conid'>True</span>
<a name="line-222"></a><span class='hs-cpp'>#else</span>
<a name="line-223"></a>                  <span class='hs-conid'>NoBuffering</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-224"></a><span class='hs-cpp'>#endif</span>
<a name="line-225"></a>                  <span class='hs-keyword'>_</span>           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IODevice</span><span class='hs-varop'>.</span><span class='hs-varid'>setRaw</span> <span class='hs-varid'>haDevice</span> <span class='hs-conid'>False</span>
<a name="line-226"></a>
<a name="line-227"></a>          <span class='hs-comment'>-- throw away spare buffers, they might be the wrong size</span>
<a name="line-228"></a>          <span class='hs-varid'>writeIORef</span> <span class='hs-varid'>haBuffers</span> <span class='hs-conid'>BufferListNil</span>
<a name="line-229"></a>
<a name="line-230"></a>          <span class='hs-varid'>return</span> <span class='hs-conid'>Handle__</span><span class='hs-layout'>{</span> <span class='hs-varid'>haBufferMode</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mode</span><span class='hs-layout'>,</span><span class='hs-keyglyph'>..</span> <span class='hs-layout'>}</span>
<a name="line-231"></a>
<a name="line-232"></a><span class='hs-comment'>-- -----------------------------------------------------------------------------</span>
<a name="line-233"></a><span class='hs-comment'>-- hSetEncoding</span>
<a name="line-234"></a>
<a name="line-235"></a><a name="hSetEncoding"></a><span class='hs-comment'>-- | The action 'hSetEncoding' @hdl@ @encoding@ changes the text encoding</span>
<a name="line-236"></a><span class='hs-comment'>-- for the handle @hdl@ to @encoding@.  The default encoding when a 'Handle' is</span>
<a name="line-237"></a><span class='hs-comment'>-- created is 'localeEncoding', namely the default encoding for the current</span>
<a name="line-238"></a><span class='hs-comment'>-- locale.</span>
<a name="line-239"></a><span class='hs-comment'>--</span>
<a name="line-240"></a><span class='hs-comment'>-- To create a 'Handle' with no encoding at all, use 'openBinaryFile'.  To</span>
<a name="line-241"></a><span class='hs-comment'>-- stop further encoding or decoding on an existing 'Handle', use</span>
<a name="line-242"></a><span class='hs-comment'>-- 'hSetBinaryMode'.</span>
<a name="line-243"></a><span class='hs-comment'>--</span>
<a name="line-244"></a><span class='hs-comment'>-- 'hSetEncoding' may need to flush buffered data in order to change</span>
<a name="line-245"></a><span class='hs-comment'>-- the encoding.</span>
<a name="line-246"></a><span class='hs-comment'>--</span>
<a name="line-247"></a><span class='hs-definition'>hSetEncoding</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TextEncoding</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-248"></a><span class='hs-definition'>hSetEncoding</span> <span class='hs-varid'>hdl</span> <span class='hs-varid'>encoding</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-249"></a>  <span class='hs-varid'>withAllHandles__</span> <span class='hs-str'>"hSetEncoding"</span> <span class='hs-varid'>hdl</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>h_</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>Handle__</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-250"></a>    <span class='hs-varid'>flushCharBuffer</span> <span class='hs-varid'>h_</span>
<a name="line-251"></a>    <span class='hs-varid'>closeTextCodecs</span> <span class='hs-varid'>h_</span>
<a name="line-252"></a>    <span class='hs-varid'>openTextEncoding</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>encoding</span><span class='hs-layout'>)</span> <span class='hs-varid'>haType</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>mb_encoder</span> <span class='hs-varid'>mb_decoder</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-253"></a>    <span class='hs-varid'>bbuf</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>readIORef</span> <span class='hs-varid'>haByteBuffer</span>
<a name="line-254"></a>    <span class='hs-varid'>ref</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newIORef</span> <span class='hs-layout'>(</span><span class='hs-varid'>error</span> <span class='hs-str'>"last_decode"</span><span class='hs-layout'>)</span>
<a name="line-255"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Handle__</span><span class='hs-layout'>{</span> <span class='hs-varid'>haLastDecode</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ref</span><span class='hs-layout'>,</span> 
<a name="line-256"></a>                      <span class='hs-varid'>haDecoder</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mb_decoder</span><span class='hs-layout'>,</span> 
<a name="line-257"></a>                      <span class='hs-varid'>haEncoder</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mb_encoder</span><span class='hs-layout'>,</span>
<a name="line-258"></a>                      <span class='hs-varid'>haCodec</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>encoding</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>..</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-259"></a>
<a name="line-260"></a><a name="hGetEncoding"></a><span class='hs-comment'>-- | Return the current 'TextEncoding' for the specified 'Handle', or</span>
<a name="line-261"></a><span class='hs-comment'>-- 'Nothing' if the 'Handle' is in binary mode.</span>
<a name="line-262"></a><span class='hs-comment'>--</span>
<a name="line-263"></a><span class='hs-comment'>-- Note that the 'TextEncoding' remembers nothing about the state of</span>
<a name="line-264"></a><span class='hs-comment'>-- the encoder/decoder in use on this 'Handle'.  For example, if the</span>
<a name="line-265"></a><span class='hs-comment'>-- encoding in use is UTF-16, then using 'hGetEncoding' and</span>
<a name="line-266"></a><span class='hs-comment'>-- 'hSetEncoding' to save and restore the encoding may result in an</span>
<a name="line-267"></a><span class='hs-comment'>-- extra byte-order-mark being written to the file.</span>
<a name="line-268"></a><span class='hs-comment'>--</span>
<a name="line-269"></a><span class='hs-definition'>hGetEncoding</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>TextEncoding</span><span class='hs-layout'>)</span>
<a name="line-270"></a><span class='hs-definition'>hGetEncoding</span> <span class='hs-varid'>hdl</span> <span class='hs-keyglyph'>=</span>
<a name="line-271"></a>  <span class='hs-varid'>withHandle_</span> <span class='hs-str'>"hGetEncoding"</span> <span class='hs-varid'>hdl</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>h_</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>Handle__</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>haCodec</span>
<a name="line-272"></a>
<a name="line-273"></a><span class='hs-comment'>-- -----------------------------------------------------------------------------</span>
<a name="line-274"></a><span class='hs-comment'>-- hFlush</span>
<a name="line-275"></a>
<a name="line-276"></a><span class='hs-comment'>-- | The action 'hFlush' @hdl@ causes any items buffered for output</span>
<a name="line-277"></a><span class='hs-comment'>-- in handle @hdl@ to be sent immediately to the operating system.</span>
<a name="line-278"></a><span class='hs-comment'>--</span>
<a name="line-279"></a><span class='hs-comment'>-- This operation may fail with:</span>
<a name="line-280"></a><span class='hs-comment'>--</span>
<a name="line-281"></a><span class='hs-comment'>--  * 'isFullError' if the device is full;</span>
<a name="line-282"></a><span class='hs-comment'>--</span>
<a name="line-283"></a><span class='hs-comment'>--  * 'isPermissionError' if a system resource limit would be exceeded.</span>
<a name="line-284"></a><span class='hs-comment'>--    It is unspecified whether the characters in the buffer are discarded</span>
<a name="line-285"></a><span class='hs-comment'>--    or retained under these circumstances.</span>
<a name="line-286"></a>
<a name="line-287"></a><a name="hFlush"></a><span class='hs-definition'>hFlush</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span> 
<a name="line-288"></a><span class='hs-definition'>hFlush</span> <span class='hs-varid'>handle</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wantWritableHandle</span> <span class='hs-str'>"hFlush"</span> <span class='hs-varid'>handle</span> <span class='hs-varid'>flushWriteBuffer</span>
<a name="line-289"></a>
<a name="line-290"></a><span class='hs-comment'>-- | The action 'hFlushAll' @hdl@ flushes all buffered data in @hdl@,</span>
<a name="line-291"></a><span class='hs-comment'>-- including any buffered read data.  Buffered read data is flushed</span>
<a name="line-292"></a><span class='hs-comment'>-- by seeking the file position back to the point before the bufferred</span>
<a name="line-293"></a><span class='hs-comment'>-- data was read, and hence only works if @hdl@ is seekable (see</span>
<a name="line-294"></a><span class='hs-comment'>-- 'hIsSeekable').</span>
<a name="line-295"></a><span class='hs-comment'>--</span>
<a name="line-296"></a><span class='hs-comment'>-- This operation may fail with:</span>
<a name="line-297"></a><span class='hs-comment'>--</span>
<a name="line-298"></a><span class='hs-comment'>--  * 'isFullError' if the device is full;</span>
<a name="line-299"></a><span class='hs-comment'>--</span>
<a name="line-300"></a><span class='hs-comment'>--  * 'isPermissionError' if a system resource limit would be exceeded.</span>
<a name="line-301"></a><span class='hs-comment'>--    It is unspecified whether the characters in the buffer are discarded</span>
<a name="line-302"></a><span class='hs-comment'>--    or retained under these circumstances;</span>
<a name="line-303"></a><span class='hs-comment'>--</span>
<a name="line-304"></a><span class='hs-comment'>--  * 'isIllegalOperation' if @hdl@ has buffered read data, and is not</span>
<a name="line-305"></a><span class='hs-comment'>--    seekable.</span>
<a name="line-306"></a>
<a name="line-307"></a><a name="hFlushAll"></a><span class='hs-definition'>hFlushAll</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span> 
<a name="line-308"></a><span class='hs-definition'>hFlushAll</span> <span class='hs-varid'>handle</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withHandle_</span> <span class='hs-str'>"hFlushAll"</span> <span class='hs-varid'>handle</span> <span class='hs-varid'>flushBuffer</span>
<a name="line-309"></a>
<a name="line-310"></a><span class='hs-comment'>-- -----------------------------------------------------------------------------</span>
<a name="line-311"></a><span class='hs-comment'>-- Repositioning Handles</span>
<a name="line-312"></a>
<a name="line-313"></a><a name="HandlePosn"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>HandlePosn</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HandlePosn</span> <span class='hs-conid'>Handle</span> <span class='hs-conid'>HandlePosition</span>
<a name="line-314"></a>
<a name="line-315"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Eq</span> <span class='hs-conid'>HandlePosn</span> <span class='hs-keyword'>where</span>
<a name="line-316"></a>    <span class='hs-layout'>(</span><span class='hs-conid'>HandlePosn</span> <span class='hs-varid'>h1</span> <span class='hs-varid'>p1</span><span class='hs-layout'>)</span> <span class='hs-varop'>==</span> <span class='hs-layout'>(</span><span class='hs-conid'>HandlePosn</span> <span class='hs-varid'>h2</span> <span class='hs-varid'>p2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>p1</span><span class='hs-varop'>==</span><span class='hs-varid'>p2</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>h1</span><span class='hs-varop'>==</span><span class='hs-varid'>h2</span>
<a name="line-317"></a>
<a name="line-318"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Show</span> <span class='hs-conid'>HandlePosn</span> <span class='hs-keyword'>where</span>
<a name="line-319"></a>   <span class='hs-varid'>showsPrec</span> <span class='hs-varid'>p</span> <span class='hs-layout'>(</span><span class='hs-conid'>HandlePosn</span> <span class='hs-varid'>h</span> <span class='hs-varid'>pos</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> 
<a name="line-320"></a>        <span class='hs-varid'>showsPrec</span> <span class='hs-varid'>p</span> <span class='hs-varid'>h</span> <span class='hs-varop'>.</span> <span class='hs-varid'>showString</span> <span class='hs-str'>" at position "</span> <span class='hs-varop'>.</span> <span class='hs-varid'>shows</span> <span class='hs-varid'>pos</span>
<a name="line-321"></a>
<a name="line-322"></a>  <span class='hs-comment'>-- HandlePosition is the Haskell equivalent of POSIX' off_t.</span>
<a name="line-323"></a>  <span class='hs-comment'>-- We represent it as an Integer on the Haskell side, but</span>
<a name="line-324"></a>  <span class='hs-comment'>-- cheat slightly in that hGetPosn calls upon a C helper</span>
<a name="line-325"></a>  <span class='hs-comment'>-- that reports the position back via (merely) an Int.</span>
<a name="line-326"></a><a name="HandlePosition"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>HandlePosition</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Integer</span>
<a name="line-327"></a>
<a name="line-328"></a><span class='hs-comment'>-- | Computation 'hGetPosn' @hdl@ returns the current I\/O position of</span>
<a name="line-329"></a><span class='hs-comment'>-- @hdl@ as a value of the abstract type 'HandlePosn'.</span>
<a name="line-330"></a>
<a name="line-331"></a><a name="hGetPosn"></a><span class='hs-definition'>hGetPosn</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>HandlePosn</span>
<a name="line-332"></a><span class='hs-definition'>hGetPosn</span> <span class='hs-varid'>handle</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-333"></a>    <span class='hs-varid'>posn</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>hTell</span> <span class='hs-varid'>handle</span>
<a name="line-334"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>HandlePosn</span> <span class='hs-varid'>handle</span> <span class='hs-varid'>posn</span><span class='hs-layout'>)</span>
<a name="line-335"></a>
<a name="line-336"></a><span class='hs-comment'>-- | If a call to 'hGetPosn' @hdl@ returns a position @p@,</span>
<a name="line-337"></a><span class='hs-comment'>-- then computation 'hSetPosn' @p@ sets the position of @hdl@</span>
<a name="line-338"></a><span class='hs-comment'>-- to the position it held at the time of the call to 'hGetPosn'.</span>
<a name="line-339"></a><span class='hs-comment'>--</span>
<a name="line-340"></a><span class='hs-comment'>-- This operation may fail with:</span>
<a name="line-341"></a><span class='hs-comment'>--</span>
<a name="line-342"></a><span class='hs-comment'>--  * 'isPermissionError' if a system resource limit would be exceeded.</span>
<a name="line-343"></a>
<a name="line-344"></a><a name="hSetPosn"></a><span class='hs-definition'>hSetPosn</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HandlePosn</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span> 
<a name="line-345"></a><span class='hs-definition'>hSetPosn</span> <span class='hs-layout'>(</span><span class='hs-conid'>HandlePosn</span> <span class='hs-varid'>h</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hSeek</span> <span class='hs-varid'>h</span> <span class='hs-conid'>AbsoluteSeek</span> <span class='hs-varid'>i</span>
<a name="line-346"></a>
<a name="line-347"></a><span class='hs-comment'>-- ---------------------------------------------------------------------------</span>
<a name="line-348"></a><span class='hs-comment'>-- hSeek</span>
<a name="line-349"></a>
<a name="line-350"></a><span class='hs-comment'>{- Note: 
<a name="line-351"></a> - when seeking using `SeekFromEnd', positive offsets (&gt;=0) means
<a name="line-352"></a>   seeking at or past EOF.
<a name="line-353"></a>
<a name="line-354"></a> - we possibly deviate from the report on the issue of seeking within
<a name="line-355"></a>   the buffer and whether to flush it or not.  The report isn't exactly
<a name="line-356"></a>   clear here.
<a name="line-357"></a>-}</span>
<a name="line-358"></a>
<a name="line-359"></a><span class='hs-comment'>-- | Computation 'hSeek' @hdl mode i@ sets the position of handle</span>
<a name="line-360"></a><span class='hs-comment'>-- @hdl@ depending on @mode@.</span>
<a name="line-361"></a><span class='hs-comment'>-- The offset @i@ is given in terms of 8-bit bytes.</span>
<a name="line-362"></a><span class='hs-comment'>--</span>
<a name="line-363"></a><span class='hs-comment'>-- If @hdl@ is block- or line-buffered, then seeking to a position which is not</span>
<a name="line-364"></a><span class='hs-comment'>-- in the current buffer will first cause any items in the output buffer to be</span>
<a name="line-365"></a><span class='hs-comment'>-- written to the device, and then cause the input buffer to be discarded.</span>
<a name="line-366"></a><span class='hs-comment'>-- Some handles may not be seekable (see 'hIsSeekable'), or only support a</span>
<a name="line-367"></a><span class='hs-comment'>-- subset of the possible positioning operations (for instance, it may only</span>
<a name="line-368"></a><span class='hs-comment'>-- be possible to seek to the end of a tape, or to a positive offset from</span>
<a name="line-369"></a><span class='hs-comment'>-- the beginning or current position).</span>
<a name="line-370"></a><span class='hs-comment'>-- It is not possible to set a negative I\/O position, or for</span>
<a name="line-371"></a><span class='hs-comment'>-- a physical file, an I\/O position beyond the current end-of-file.</span>
<a name="line-372"></a><span class='hs-comment'>--</span>
<a name="line-373"></a><span class='hs-comment'>-- This operation may fail with:</span>
<a name="line-374"></a><span class='hs-comment'>--</span>
<a name="line-375"></a><span class='hs-comment'>--  * 'isIllegalOperationError' if the Handle is not seekable, or does</span>
<a name="line-376"></a><span class='hs-comment'>--     not support the requested seek mode.</span>
<a name="line-377"></a><span class='hs-comment'>--</span>
<a name="line-378"></a><span class='hs-comment'>--  * 'isPermissionError' if a system resource limit would be exceeded.</span>
<a name="line-379"></a>
<a name="line-380"></a><a name="hSeek"></a><span class='hs-definition'>hSeek</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SeekMode</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Integer</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span> 
<a name="line-381"></a><span class='hs-definition'>hSeek</span> <span class='hs-varid'>handle</span> <span class='hs-varid'>mode</span> <span class='hs-varid'>offset</span> <span class='hs-keyglyph'>=</span>
<a name="line-382"></a>    <span class='hs-varid'>wantSeekableHandle</span> <span class='hs-str'>"hSeek"</span> <span class='hs-varid'>handle</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>handle_</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>Handle__</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-383"></a>    <span class='hs-varid'>debugIO</span> <span class='hs-layout'>(</span><span class='hs-str'>"hSeek "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-varid'>mode</span><span class='hs-layout'>,</span><span class='hs-varid'>offset</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-384"></a>    <span class='hs-varid'>buf</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>readIORef</span> <span class='hs-varid'>haCharBuffer</span>
<a name="line-385"></a>
<a name="line-386"></a>    <span class='hs-keyword'>if</span> <span class='hs-varid'>isWriteBuffer</span> <span class='hs-varid'>buf</span>
<a name="line-387"></a>        <span class='hs-keyword'>then</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>flushWriteBuffer</span> <span class='hs-varid'>handle_</span>
<a name="line-388"></a>                <span class='hs-conid'>IODevice</span><span class='hs-varop'>.</span><span class='hs-varid'>seek</span> <span class='hs-varid'>haDevice</span> <span class='hs-varid'>mode</span> <span class='hs-varid'>offset</span>
<a name="line-389"></a>        <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span>
<a name="line-390"></a>
<a name="line-391"></a>    <span class='hs-keyword'>let</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bufL</span> <span class='hs-varid'>buf</span><span class='hs-layout'>;</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bufR</span> <span class='hs-varid'>buf</span>
<a name="line-392"></a>    <span class='hs-keyword'>if</span> <span class='hs-varid'>mode</span> <span class='hs-varop'>==</span> <span class='hs-conid'>RelativeSeek</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>isNothing</span> <span class='hs-varid'>haDecoder</span> <span class='hs-varop'>&amp;&amp;</span> 
<a name="line-393"></a>       <span class='hs-varid'>offset</span> <span class='hs-varop'>&gt;=</span> <span class='hs-num'>0</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>offset</span> <span class='hs-varop'>&lt;</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>w</span> <span class='hs-comment'>-</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-394"></a>        <span class='hs-keyword'>then</span> <span class='hs-varid'>writeIORef</span> <span class='hs-varid'>haCharBuffer</span> <span class='hs-varid'>buf</span><span class='hs-layout'>{</span> <span class='hs-varid'>bufL</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>r</span> <span class='hs-varop'>+</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>offset</span> <span class='hs-layout'>}</span>
<a name="line-395"></a>        <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span> 
<a name="line-396"></a>
<a name="line-397"></a>    <span class='hs-varid'>flushCharReadBuffer</span> <span class='hs-varid'>handle_</span>
<a name="line-398"></a>    <span class='hs-varid'>flushByteReadBuffer</span> <span class='hs-varid'>handle_</span>
<a name="line-399"></a>    <span class='hs-conid'>IODevice</span><span class='hs-varop'>.</span><span class='hs-varid'>seek</span> <span class='hs-varid'>haDevice</span> <span class='hs-varid'>mode</span> <span class='hs-varid'>offset</span>
<a name="line-400"></a>
<a name="line-401"></a>
<a name="line-402"></a><a name="hTell"></a><span class='hs-comment'>-- | Computation 'hTell' @hdl@ returns the current position of the</span>
<a name="line-403"></a><span class='hs-comment'>-- handle @hdl@, as the number of bytes from the beginning of</span>
<a name="line-404"></a><span class='hs-comment'>-- the file.  The value returned may be subsequently passed to</span>
<a name="line-405"></a><span class='hs-comment'>-- 'hSeek' to reposition the handle to the current position.</span>
<a name="line-406"></a><span class='hs-comment'>-- </span>
<a name="line-407"></a><span class='hs-comment'>-- This operation may fail with:</span>
<a name="line-408"></a><span class='hs-comment'>--</span>
<a name="line-409"></a><span class='hs-comment'>--  * 'isIllegalOperationError' if the Handle is not seekable.</span>
<a name="line-410"></a><span class='hs-comment'>--</span>
<a name="line-411"></a><span class='hs-definition'>hTell</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Integer</span>
<a name="line-412"></a><span class='hs-definition'>hTell</span> <span class='hs-varid'>handle</span> <span class='hs-keyglyph'>=</span> 
<a name="line-413"></a>    <span class='hs-varid'>wantSeekableHandle</span> <span class='hs-str'>"hGetPosn"</span> <span class='hs-varid'>handle</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>handle_</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>Handle__</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-414"></a>
<a name="line-415"></a>      <span class='hs-varid'>posn</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>IODevice</span><span class='hs-varop'>.</span><span class='hs-varid'>tell</span> <span class='hs-varid'>haDevice</span>
<a name="line-416"></a>
<a name="line-417"></a>      <span class='hs-comment'>-- we can't tell the real byte offset if there are buffered</span>
<a name="line-418"></a>      <span class='hs-comment'>-- Chars, so must flush first:</span>
<a name="line-419"></a>      <span class='hs-varid'>flushCharBuffer</span> <span class='hs-varid'>handle_</span>
<a name="line-420"></a>
<a name="line-421"></a>      <span class='hs-varid'>bbuf</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>readIORef</span> <span class='hs-varid'>haByteBuffer</span>
<a name="line-422"></a>
<a name="line-423"></a>      <span class='hs-keyword'>let</span> <span class='hs-varid'>real_posn</span>
<a name="line-424"></a>           <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isWriteBuffer</span> <span class='hs-varid'>bbuf</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>posn</span> <span class='hs-varop'>+</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>bufferElems</span> <span class='hs-varid'>bbuf</span><span class='hs-layout'>)</span>
<a name="line-425"></a>           <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>posn</span> <span class='hs-comment'>-</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-layout'>(</span><span class='hs-varid'>bufferElems</span> <span class='hs-varid'>bbuf</span><span class='hs-layout'>)</span>
<a name="line-426"></a>
<a name="line-427"></a>      <span class='hs-varid'>cbuf</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>readIORef</span> <span class='hs-varid'>haCharBuffer</span>
<a name="line-428"></a>      <span class='hs-varid'>debugIO</span> <span class='hs-layout'>(</span><span class='hs-str'>"\nhGetPosn: (posn, real_posn) = "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-varid'>posn</span><span class='hs-layout'>,</span> <span class='hs-varid'>real_posn</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-429"></a>      <span class='hs-varid'>debugIO</span> <span class='hs-layout'>(</span><span class='hs-str'>"   cbuf: "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>summaryBuffer</span> <span class='hs-varid'>cbuf</span> <span class='hs-varop'>++</span>
<a name="line-430"></a>            <span class='hs-str'>"   bbuf: "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>summaryBuffer</span> <span class='hs-varid'>bbuf</span><span class='hs-layout'>)</span>
<a name="line-431"></a>
<a name="line-432"></a>      <span class='hs-varid'>return</span> <span class='hs-varid'>real_posn</span>
<a name="line-433"></a>
<a name="line-434"></a><span class='hs-comment'>-- -----------------------------------------------------------------------------</span>
<a name="line-435"></a><span class='hs-comment'>-- Handle Properties</span>
<a name="line-436"></a>
<a name="line-437"></a><span class='hs-comment'>-- A number of operations return information about the properties of a</span>
<a name="line-438"></a><span class='hs-comment'>-- handle.  Each of these operations returns `True' if the handle has</span>
<a name="line-439"></a><span class='hs-comment'>-- the specified property, and `False' otherwise.</span>
<a name="line-440"></a>
<a name="line-441"></a><a name="hIsOpen"></a><span class='hs-definition'>hIsOpen</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Bool</span>
<a name="line-442"></a><span class='hs-definition'>hIsOpen</span> <span class='hs-varid'>handle</span> <span class='hs-keyglyph'>=</span>
<a name="line-443"></a>    <span class='hs-varid'>withHandle_</span> <span class='hs-str'>"hIsOpen"</span> <span class='hs-varid'>handle</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>handle_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-444"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>haType</span> <span class='hs-varid'>handle_</span> <span class='hs-keyword'>of</span> 
<a name="line-445"></a>      <span class='hs-conid'>ClosedHandle</span>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>False</span>
<a name="line-446"></a>      <span class='hs-conid'>SemiClosedHandle</span>     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>False</span>
<a name="line-447"></a>      <span class='hs-keyword'>_</span>                    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>True</span>
<a name="line-448"></a>
<a name="line-449"></a><a name="hIsClosed"></a><span class='hs-definition'>hIsClosed</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Bool</span>
<a name="line-450"></a><span class='hs-definition'>hIsClosed</span> <span class='hs-varid'>handle</span> <span class='hs-keyglyph'>=</span>
<a name="line-451"></a>    <span class='hs-varid'>withHandle_</span> <span class='hs-str'>"hIsClosed"</span> <span class='hs-varid'>handle</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>handle_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-452"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>haType</span> <span class='hs-varid'>handle_</span> <span class='hs-keyword'>of</span> 
<a name="line-453"></a>      <span class='hs-conid'>ClosedHandle</span>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>True</span>
<a name="line-454"></a>      <span class='hs-keyword'>_</span>                    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>False</span>
<a name="line-455"></a>
<a name="line-456"></a><span class='hs-comment'>{- not defined, nor exported, but mentioned
<a name="line-457"></a>   here for documentation purposes:
<a name="line-458"></a>
<a name="line-459"></a>    hSemiClosed :: Handle -&gt; IO Bool
<a name="line-460"></a>    hSemiClosed h = do
<a name="line-461"></a>       ho &lt;- hIsOpen h
<a name="line-462"></a>       hc &lt;- hIsClosed h
<a name="line-463"></a>       return (not (ho || hc))
<a name="line-464"></a>-}</span>
<a name="line-465"></a>
<a name="line-466"></a><a name="hIsReadable"></a><span class='hs-definition'>hIsReadable</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Bool</span>
<a name="line-467"></a><span class='hs-definition'>hIsReadable</span> <span class='hs-layout'>(</span><span class='hs-conid'>DuplexHandle</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>True</span>
<a name="line-468"></a><span class='hs-definition'>hIsReadable</span> <span class='hs-varid'>handle</span> <span class='hs-keyglyph'>=</span>
<a name="line-469"></a>    <span class='hs-varid'>withHandle_</span> <span class='hs-str'>"hIsReadable"</span> <span class='hs-varid'>handle</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>handle_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-470"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>haType</span> <span class='hs-varid'>handle_</span> <span class='hs-keyword'>of</span> 
<a name="line-471"></a>      <span class='hs-conid'>ClosedHandle</span>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ioe_closedHandle</span>
<a name="line-472"></a>      <span class='hs-conid'>SemiClosedHandle</span>     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ioe_closedHandle</span>
<a name="line-473"></a>      <span class='hs-varid'>htype</span>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>isReadableHandleType</span> <span class='hs-varid'>htype</span><span class='hs-layout'>)</span>
<a name="line-474"></a>
<a name="line-475"></a><a name="hIsWritable"></a><span class='hs-definition'>hIsWritable</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Bool</span>
<a name="line-476"></a><span class='hs-definition'>hIsWritable</span> <span class='hs-layout'>(</span><span class='hs-conid'>DuplexHandle</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>True</span>
<a name="line-477"></a><span class='hs-definition'>hIsWritable</span> <span class='hs-varid'>handle</span> <span class='hs-keyglyph'>=</span>
<a name="line-478"></a>    <span class='hs-varid'>withHandle_</span> <span class='hs-str'>"hIsWritable"</span> <span class='hs-varid'>handle</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>handle_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-479"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>haType</span> <span class='hs-varid'>handle_</span> <span class='hs-keyword'>of</span> 
<a name="line-480"></a>      <span class='hs-conid'>ClosedHandle</span>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ioe_closedHandle</span>
<a name="line-481"></a>      <span class='hs-conid'>SemiClosedHandle</span>     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ioe_closedHandle</span>
<a name="line-482"></a>      <span class='hs-varid'>htype</span>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>isWritableHandleType</span> <span class='hs-varid'>htype</span><span class='hs-layout'>)</span>
<a name="line-483"></a>
<a name="line-484"></a><span class='hs-comment'>-- | Computation 'hGetBuffering' @hdl@ returns the current buffering mode</span>
<a name="line-485"></a><span class='hs-comment'>-- for @hdl@.</span>
<a name="line-486"></a>
<a name="line-487"></a><a name="hGetBuffering"></a><span class='hs-definition'>hGetBuffering</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>BufferMode</span>
<a name="line-488"></a><span class='hs-definition'>hGetBuffering</span> <span class='hs-varid'>handle</span> <span class='hs-keyglyph'>=</span> 
<a name="line-489"></a>    <span class='hs-varid'>withHandle_</span> <span class='hs-str'>"hGetBuffering"</span> <span class='hs-varid'>handle</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>handle_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-490"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>haType</span> <span class='hs-varid'>handle_</span> <span class='hs-keyword'>of</span> 
<a name="line-491"></a>      <span class='hs-conid'>ClosedHandle</span>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ioe_closedHandle</span>
<a name="line-492"></a>      <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> 
<a name="line-493"></a>           <span class='hs-comment'>-- We're being non-standard here, and allow the buffering</span>
<a name="line-494"></a>           <span class='hs-comment'>-- of a semi-closed handle to be queried.   -- sof 6/98</span>
<a name="line-495"></a>          <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>haBufferMode</span> <span class='hs-varid'>handle_</span><span class='hs-layout'>)</span>  <span class='hs-comment'>-- could be stricter..</span>
<a name="line-496"></a>
<a name="line-497"></a><a name="hIsSeekable"></a><span class='hs-definition'>hIsSeekable</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Bool</span>
<a name="line-498"></a><span class='hs-definition'>hIsSeekable</span> <span class='hs-varid'>handle</span> <span class='hs-keyglyph'>=</span>
<a name="line-499"></a>    <span class='hs-varid'>withHandle_</span> <span class='hs-str'>"hIsSeekable"</span> <span class='hs-varid'>handle</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>handle_</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>Handle__</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-500"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>haType</span> <span class='hs-keyword'>of</span> 
<a name="line-501"></a>      <span class='hs-conid'>ClosedHandle</span>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ioe_closedHandle</span>
<a name="line-502"></a>      <span class='hs-conid'>SemiClosedHandle</span>     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ioe_closedHandle</span>
<a name="line-503"></a>      <span class='hs-conid'>AppendHandle</span>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>False</span>
<a name="line-504"></a>      <span class='hs-keyword'>_</span>                    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IODevice</span><span class='hs-varop'>.</span><span class='hs-varid'>isSeekable</span> <span class='hs-varid'>haDevice</span>
<a name="line-505"></a>
<a name="line-506"></a><span class='hs-comment'>-- -----------------------------------------------------------------------------</span>
<a name="line-507"></a><span class='hs-comment'>-- Changing echo status (Non-standard GHC extensions)</span>
<a name="line-508"></a>
<a name="line-509"></a><span class='hs-comment'>-- | Set the echoing status of a handle connected to a terminal.</span>
<a name="line-510"></a>
<a name="line-511"></a><a name="hSetEcho"></a><span class='hs-definition'>hSetEcho</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-512"></a><span class='hs-definition'>hSetEcho</span> <span class='hs-varid'>handle</span> <span class='hs-varid'>on</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-513"></a>    <span class='hs-varid'>isT</span>   <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>hIsTerminalDevice</span> <span class='hs-varid'>handle</span>
<a name="line-514"></a>    <span class='hs-keyword'>if</span> <span class='hs-varid'>not</span> <span class='hs-varid'>isT</span>
<a name="line-515"></a>     <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-516"></a>     <span class='hs-keyword'>else</span>
<a name="line-517"></a>      <span class='hs-varid'>withHandle_</span> <span class='hs-str'>"hSetEcho"</span> <span class='hs-varid'>handle</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-conid'>Handle__</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-518"></a>      <span class='hs-keyword'>case</span> <span class='hs-varid'>haType</span> <span class='hs-keyword'>of</span> 
<a name="line-519"></a>         <span class='hs-conid'>ClosedHandle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ioe_closedHandle</span>
<a name="line-520"></a>         <span class='hs-keyword'>_</span>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IODevice</span><span class='hs-varop'>.</span><span class='hs-varid'>setEcho</span> <span class='hs-varid'>haDevice</span> <span class='hs-varid'>on</span>
<a name="line-521"></a>
<a name="line-522"></a><span class='hs-comment'>-- | Get the echoing status of a handle connected to a terminal.</span>
<a name="line-523"></a>
<a name="line-524"></a><a name="hGetEcho"></a><span class='hs-definition'>hGetEcho</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Bool</span>
<a name="line-525"></a><span class='hs-definition'>hGetEcho</span> <span class='hs-varid'>handle</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-526"></a>    <span class='hs-varid'>isT</span>   <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>hIsTerminalDevice</span> <span class='hs-varid'>handle</span>
<a name="line-527"></a>    <span class='hs-keyword'>if</span> <span class='hs-varid'>not</span> <span class='hs-varid'>isT</span>
<a name="line-528"></a>     <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-conid'>False</span>
<a name="line-529"></a>     <span class='hs-keyword'>else</span>
<a name="line-530"></a>       <span class='hs-varid'>withHandle_</span> <span class='hs-str'>"hGetEcho"</span> <span class='hs-varid'>handle</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-conid'>Handle__</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-531"></a>       <span class='hs-keyword'>case</span> <span class='hs-varid'>haType</span> <span class='hs-keyword'>of</span> 
<a name="line-532"></a>         <span class='hs-conid'>ClosedHandle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ioe_closedHandle</span>
<a name="line-533"></a>         <span class='hs-keyword'>_</span>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IODevice</span><span class='hs-varop'>.</span><span class='hs-varid'>getEcho</span> <span class='hs-varid'>haDevice</span>
<a name="line-534"></a>
<a name="line-535"></a><span class='hs-comment'>-- | Is the handle connected to a terminal?</span>
<a name="line-536"></a>
<a name="line-537"></a><a name="hIsTerminalDevice"></a><span class='hs-definition'>hIsTerminalDevice</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Bool</span>
<a name="line-538"></a><span class='hs-definition'>hIsTerminalDevice</span> <span class='hs-varid'>handle</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-539"></a>    <span class='hs-varid'>withHandle_</span> <span class='hs-str'>"hIsTerminalDevice"</span> <span class='hs-varid'>handle</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-conid'>Handle__</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-540"></a>     <span class='hs-keyword'>case</span> <span class='hs-varid'>haType</span> <span class='hs-keyword'>of</span> 
<a name="line-541"></a>       <span class='hs-conid'>ClosedHandle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ioe_closedHandle</span>
<a name="line-542"></a>       <span class='hs-keyword'>_</span>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IODevice</span><span class='hs-varop'>.</span><span class='hs-varid'>isTerminal</span> <span class='hs-varid'>haDevice</span>
<a name="line-543"></a>
<a name="line-544"></a><span class='hs-comment'>-- -----------------------------------------------------------------------------</span>
<a name="line-545"></a><span class='hs-comment'>-- hSetBinaryMode</span>
<a name="line-546"></a>
<a name="line-547"></a><a name="hSetBinaryMode"></a><span class='hs-comment'>-- | Select binary mode ('True') or text mode ('False') on a open handle.</span>
<a name="line-548"></a><span class='hs-comment'>-- (See also 'openBinaryFile'.)</span>
<a name="line-549"></a><span class='hs-comment'>--</span>
<a name="line-550"></a><span class='hs-comment'>-- This has the same effect as calling 'hSetEncoding' with 'latin1', together</span>
<a name="line-551"></a><span class='hs-comment'>-- with 'hSetNewlineMode' with 'noNewlineTranslation'.</span>
<a name="line-552"></a><span class='hs-comment'>--</span>
<a name="line-553"></a><span class='hs-definition'>hSetBinaryMode</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-554"></a><span class='hs-definition'>hSetBinaryMode</span> <span class='hs-varid'>handle</span> <span class='hs-varid'>bin</span> <span class='hs-keyglyph'>=</span>
<a name="line-555"></a>  <span class='hs-varid'>withAllHandles__</span> <span class='hs-str'>"hSetBinaryMode"</span> <span class='hs-varid'>handle</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>h_</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>Handle__</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-556"></a>    <span class='hs-keyword'>do</span> 
<a name="line-557"></a>         <span class='hs-varid'>flushCharBuffer</span> <span class='hs-varid'>h_</span>
<a name="line-558"></a>         <span class='hs-varid'>closeTextCodecs</span> <span class='hs-varid'>h_</span>
<a name="line-559"></a>
<a name="line-560"></a>         <span class='hs-keyword'>let</span> <span class='hs-varid'>mb_te</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>bin</span>       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-561"></a>                   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>localeEncoding</span>
<a name="line-562"></a>
<a name="line-563"></a>         <span class='hs-varid'>openTextEncoding</span> <span class='hs-varid'>mb_te</span> <span class='hs-varid'>haType</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>mb_encoder</span> <span class='hs-varid'>mb_decoder</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-564"></a>
<a name="line-565"></a>         <span class='hs-comment'>-- should match the default newline mode, whatever that is</span>
<a name="line-566"></a>         <span class='hs-keyword'>let</span> <span class='hs-varid'>nl</span>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>bin</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>noNewlineTranslation</span>
<a name="line-567"></a>                   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nativeNewlineMode</span>
<a name="line-568"></a>
<a name="line-569"></a>         <span class='hs-varid'>bbuf</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>readIORef</span> <span class='hs-varid'>haByteBuffer</span>
<a name="line-570"></a>         <span class='hs-varid'>ref</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newIORef</span> <span class='hs-layout'>(</span><span class='hs-varid'>error</span> <span class='hs-str'>"codec_state"</span><span class='hs-layout'>,</span> <span class='hs-varid'>bbuf</span><span class='hs-layout'>)</span>
<a name="line-571"></a>
<a name="line-572"></a>         <span class='hs-varid'>return</span> <span class='hs-conid'>Handle__</span><span class='hs-layout'>{</span> <span class='hs-varid'>haLastDecode</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ref</span><span class='hs-layout'>,</span>
<a name="line-573"></a>                          <span class='hs-varid'>haEncoder</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mb_encoder</span><span class='hs-layout'>,</span> 
<a name="line-574"></a>                          <span class='hs-varid'>haDecoder</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mb_decoder</span><span class='hs-layout'>,</span>
<a name="line-575"></a>                          <span class='hs-varid'>haCodec</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mb_te</span><span class='hs-layout'>,</span>
<a name="line-576"></a>                          <span class='hs-varid'>haInputNL</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>inputNL</span> <span class='hs-varid'>nl</span><span class='hs-layout'>,</span>
<a name="line-577"></a>                          <span class='hs-varid'>haOutputNL</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>outputNL</span> <span class='hs-varid'>nl</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>..</span> <span class='hs-layout'>}</span>
<a name="line-578"></a>  
<a name="line-579"></a><span class='hs-comment'>-- -----------------------------------------------------------------------------</span>
<a name="line-580"></a><span class='hs-comment'>-- hSetNewlineMode</span>
<a name="line-581"></a>
<a name="line-582"></a><a name="hSetNewlineMode"></a><span class='hs-comment'>-- | Set the 'NewlineMode' on the specified 'Handle'.  All buffered</span>
<a name="line-583"></a><span class='hs-comment'>-- data is flushed first.</span>
<a name="line-584"></a><span class='hs-definition'>hSetNewlineMode</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>NewlineMode</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-585"></a><span class='hs-definition'>hSetNewlineMode</span> <span class='hs-varid'>handle</span> <span class='hs-conid'>NewlineMode</span><span class='hs-layout'>{</span> <span class='hs-varid'>inputNL</span><span class='hs-keyglyph'>=</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span> <span class='hs-varid'>outputNL</span><span class='hs-keyglyph'>=</span><span class='hs-varid'>o</span> <span class='hs-layout'>}</span> <span class='hs-keyglyph'>=</span>
<a name="line-586"></a>  <span class='hs-varid'>withAllHandles__</span> <span class='hs-str'>"hSetNewlineMode"</span> <span class='hs-varid'>handle</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>h_</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>Handle__</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-587"></a>    <span class='hs-keyword'>do</span>
<a name="line-588"></a>         <span class='hs-varid'>flushBuffer</span> <span class='hs-varid'>h_</span>
<a name="line-589"></a>         <span class='hs-varid'>return</span> <span class='hs-varid'>h_</span><span class='hs-layout'>{</span> <span class='hs-varid'>haInputNL</span><span class='hs-keyglyph'>=</span><span class='hs-varid'>i</span><span class='hs-layout'>,</span> <span class='hs-varid'>haOutputNL</span><span class='hs-keyglyph'>=</span><span class='hs-varid'>o</span> <span class='hs-layout'>}</span>
<a name="line-590"></a>
<a name="line-591"></a><span class='hs-comment'>-- -----------------------------------------------------------------------------</span>
<a name="line-592"></a><span class='hs-comment'>-- Duplicating a Handle</span>
<a name="line-593"></a>
<a name="line-594"></a><span class='hs-comment'>-- | Returns a duplicate of the original handle, with its own buffer.</span>
<a name="line-595"></a><span class='hs-comment'>-- The two Handles will share a file pointer, however.  The original</span>
<a name="line-596"></a><span class='hs-comment'>-- handle's buffer is flushed, including discarding any input data,</span>
<a name="line-597"></a><span class='hs-comment'>-- before the handle is duplicated.</span>
<a name="line-598"></a>
<a name="line-599"></a><a name="hDuplicate"></a><span class='hs-definition'>hDuplicate</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Handle</span>
<a name="line-600"></a><span class='hs-definition'>hDuplicate</span> <span class='hs-varid'>h</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>FileHandle</span> <span class='hs-varid'>path</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-601"></a>  <span class='hs-varid'>withHandle_'</span> <span class='hs-str'>"hDuplicate"</span> <span class='hs-varid'>h</span> <span class='hs-varid'>m</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>h_</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-602"></a>      <span class='hs-varid'>dupHandle</span> <span class='hs-varid'>path</span> <span class='hs-varid'>h</span> <span class='hs-conid'>Nothing</span> <span class='hs-varid'>h_</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>handleFinalizer</span><span class='hs-layout'>)</span>
<a name="line-603"></a><span class='hs-definition'>hDuplicate</span> <span class='hs-varid'>h</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>DuplexHandle</span> <span class='hs-varid'>path</span> <span class='hs-varid'>r</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-604"></a>  <span class='hs-varid'>write_side</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>FileHandle</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>write_m</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> 
<a name="line-605"></a>     <span class='hs-varid'>withHandle_'</span> <span class='hs-str'>"hDuplicate"</span> <span class='hs-varid'>h</span> <span class='hs-varid'>w</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>h_</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-606"></a>        <span class='hs-varid'>dupHandle</span> <span class='hs-varid'>path</span> <span class='hs-varid'>h</span> <span class='hs-conid'>Nothing</span> <span class='hs-varid'>h_</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>handleFinalizer</span><span class='hs-layout'>)</span>
<a name="line-607"></a>  <span class='hs-varid'>read_side</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>FileHandle</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>read_m</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> 
<a name="line-608"></a>    <span class='hs-varid'>withHandle_'</span> <span class='hs-str'>"hDuplicate"</span> <span class='hs-varid'>h</span> <span class='hs-varid'>r</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>h_</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-609"></a>        <span class='hs-varid'>dupHandle</span> <span class='hs-varid'>path</span> <span class='hs-varid'>h</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>write_m</span><span class='hs-layout'>)</span> <span class='hs-varid'>h_</span>  <span class='hs-conid'>Nothing</span>
<a name="line-610"></a>  <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>DuplexHandle</span> <span class='hs-varid'>path</span> <span class='hs-varid'>read_m</span> <span class='hs-varid'>write_m</span><span class='hs-layout'>)</span>
<a name="line-611"></a>
<a name="line-612"></a><a name="dupHandle"></a><span class='hs-definition'>dupHandle</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePath</span>
<a name="line-613"></a>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Handle</span>
<a name="line-614"></a>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>MVar</span> <span class='hs-conid'>Handle__</span><span class='hs-layout'>)</span>
<a name="line-615"></a>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Handle__</span>
<a name="line-616"></a>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>HandleFinalizer</span>
<a name="line-617"></a>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Handle</span>
<a name="line-618"></a><span class='hs-definition'>dupHandle</span> <span class='hs-varid'>filepath</span> <span class='hs-varid'>h</span> <span class='hs-varid'>other_side</span> <span class='hs-varid'>h_</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>Handle__</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-varid'>mb_finalizer</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-619"></a>  <span class='hs-comment'>-- flush the buffer first, so we don't have to copy its contents</span>
<a name="line-620"></a>  <span class='hs-varid'>flushBuffer</span> <span class='hs-varid'>h_</span>
<a name="line-621"></a>  <span class='hs-keyword'>case</span> <span class='hs-varid'>other_side</span> <span class='hs-keyword'>of</span>
<a name="line-622"></a>    <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-623"></a>       <span class='hs-varid'>new_dev</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>IODevice</span><span class='hs-varop'>.</span><span class='hs-varid'>dup</span> <span class='hs-varid'>haDevice</span>
<a name="line-624"></a>       <span class='hs-varid'>dupHandle_</span> <span class='hs-varid'>new_dev</span> <span class='hs-varid'>filepath</span> <span class='hs-varid'>other_side</span> <span class='hs-varid'>h_</span> <span class='hs-varid'>mb_finalizer</span>
<a name="line-625"></a>    <span class='hs-conid'>Just</span> <span class='hs-varid'>r</span>  <span class='hs-keyglyph'>-&gt;</span> 
<a name="line-626"></a>       <span class='hs-varid'>withHandle_'</span> <span class='hs-str'>"dupHandle"</span> <span class='hs-varid'>h</span> <span class='hs-varid'>r</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-conid'>Handle__</span><span class='hs-layout'>{</span><span class='hs-varid'>haDevice</span><span class='hs-keyglyph'>=</span><span class='hs-varid'>dev</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-627"></a>         <span class='hs-varid'>dupHandle_</span> <span class='hs-varid'>dev</span> <span class='hs-varid'>filepath</span> <span class='hs-varid'>other_side</span> <span class='hs-varid'>h_</span> <span class='hs-varid'>mb_finalizer</span>
<a name="line-628"></a>
<a name="line-629"></a><a name="dupHandle_"></a><span class='hs-definition'>dupHandle_</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>IODevice</span> <span class='hs-varid'>dev</span><span class='hs-layout'>,</span> <span class='hs-conid'>BufferedIO</span> <span class='hs-varid'>dev</span><span class='hs-layout'>,</span> <span class='hs-conid'>Typeable</span> <span class='hs-varid'>dev</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>dev</span>
<a name="line-630"></a>           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</span>
<a name="line-631"></a>           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>MVar</span> <span class='hs-conid'>Handle__</span><span class='hs-layout'>)</span>
<a name="line-632"></a>           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Handle__</span>
<a name="line-633"></a>           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>HandleFinalizer</span>
<a name="line-634"></a>           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Handle</span>
<a name="line-635"></a><span class='hs-definition'>dupHandle_</span> <span class='hs-varid'>new_dev</span> <span class='hs-varid'>filepath</span> <span class='hs-varid'>other_side</span> <span class='hs-varid'>h_</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>Handle__</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-varid'>mb_finalizer</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-636"></a>   <span class='hs-comment'>-- XXX wrong!</span>
<a name="line-637"></a>  <span class='hs-keyword'>let</span> <span class='hs-varid'>mb_codec</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>isJust</span> <span class='hs-varid'>haEncoder</span> <span class='hs-keyword'>then</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>localeEncoding</span> <span class='hs-keyword'>else</span> <span class='hs-conid'>Nothing</span>
<a name="line-638"></a>  <span class='hs-varid'>mkHandle</span> <span class='hs-varid'>new_dev</span> <span class='hs-varid'>filepath</span> <span class='hs-varid'>haType</span> <span class='hs-conid'>True</span><span class='hs-comment'>{-buffered-}</span> <span class='hs-varid'>mb_codec</span>
<a name="line-639"></a>      <span class='hs-conid'>NewlineMode</span> <span class='hs-layout'>{</span> <span class='hs-varid'>inputNL</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>haInputNL</span><span class='hs-layout'>,</span> <span class='hs-varid'>outputNL</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>haOutputNL</span> <span class='hs-layout'>}</span>
<a name="line-640"></a>      <span class='hs-varid'>mb_finalizer</span> <span class='hs-varid'>other_side</span>
<a name="line-641"></a>
<a name="line-642"></a><span class='hs-comment'>-- -----------------------------------------------------------------------------</span>
<a name="line-643"></a><span class='hs-comment'>-- Replacing a Handle</span>
<a name="line-644"></a>
<a name="line-645"></a><span class='hs-comment'>{- |
<a name="line-646"></a>Makes the second handle a duplicate of the first handle.  The second 
<a name="line-647"></a>handle will be closed first, if it is not already.
<a name="line-648"></a>
<a name="line-649"></a>This can be used to retarget the standard Handles, for example:
<a name="line-650"></a>
<a name="line-651"></a>&gt; do h &lt;- openFile "mystdout" WriteMode
<a name="line-652"></a>&gt;    hDuplicateTo h stdout
<a name="line-653"></a>-}</span>
<a name="line-654"></a>
<a name="line-655"></a><a name="hDuplicateTo"></a><span class='hs-definition'>hDuplicateTo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-656"></a><span class='hs-definition'>hDuplicateTo</span> <span class='hs-varid'>h1</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>FileHandle</span> <span class='hs-varid'>path</span> <span class='hs-varid'>m1</span><span class='hs-layout'>)</span> <span class='hs-varid'>h2</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>FileHandle</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>m2</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-657"></a> <span class='hs-varid'>withHandle__'</span> <span class='hs-str'>"hDuplicateTo"</span> <span class='hs-varid'>h2</span> <span class='hs-varid'>m2</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>h2_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-658"></a>   <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>hClose_help</span> <span class='hs-varid'>h2_</span>
<a name="line-659"></a>   <span class='hs-varid'>withHandle_'</span> <span class='hs-str'>"hDuplicateTo"</span> <span class='hs-varid'>h1</span> <span class='hs-varid'>m1</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>h1_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-660"></a>     <span class='hs-varid'>dupHandleTo</span> <span class='hs-varid'>path</span> <span class='hs-varid'>h1</span> <span class='hs-conid'>Nothing</span> <span class='hs-varid'>h2_</span> <span class='hs-varid'>h1_</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>handleFinalizer</span><span class='hs-layout'>)</span>
<a name="line-661"></a><span class='hs-definition'>hDuplicateTo</span> <span class='hs-varid'>h1</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>DuplexHandle</span> <span class='hs-varid'>path</span> <span class='hs-varid'>r1</span> <span class='hs-varid'>w1</span><span class='hs-layout'>)</span> <span class='hs-varid'>h2</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>DuplexHandle</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>r2</span> <span class='hs-varid'>w2</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-662"></a> <span class='hs-varid'>withHandle__'</span> <span class='hs-str'>"hDuplicateTo"</span> <span class='hs-varid'>h2</span> <span class='hs-varid'>w2</span>  <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>w2_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-663"></a>   <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>hClose_help</span> <span class='hs-varid'>w2_</span>
<a name="line-664"></a>   <span class='hs-varid'>withHandle_'</span> <span class='hs-str'>"hDuplicateTo"</span> <span class='hs-varid'>h1</span> <span class='hs-varid'>w1</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>w1_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-665"></a>     <span class='hs-varid'>dupHandleTo</span> <span class='hs-varid'>path</span> <span class='hs-varid'>h1</span> <span class='hs-conid'>Nothing</span> <span class='hs-varid'>w2_</span> <span class='hs-varid'>w1_</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>handleFinalizer</span><span class='hs-layout'>)</span>
<a name="line-666"></a> <span class='hs-varid'>withHandle__'</span> <span class='hs-str'>"hDuplicateTo"</span> <span class='hs-varid'>h2</span> <span class='hs-varid'>r2</span>  <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>r2_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-667"></a>   <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>hClose_help</span> <span class='hs-varid'>r2_</span>
<a name="line-668"></a>   <span class='hs-varid'>withHandle_'</span> <span class='hs-str'>"hDuplicateTo"</span> <span class='hs-varid'>h1</span> <span class='hs-varid'>r1</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>r1_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-669"></a>     <span class='hs-varid'>dupHandleTo</span> <span class='hs-varid'>path</span> <span class='hs-varid'>h1</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>w1</span><span class='hs-layout'>)</span> <span class='hs-varid'>r2_</span> <span class='hs-varid'>r1_</span> <span class='hs-conid'>Nothing</span>
<a name="line-670"></a><span class='hs-definition'>hDuplicateTo</span> <span class='hs-varid'>h1</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> 
<a name="line-671"></a>  <span class='hs-varid'>ioe_dupHandlesNotCompatible</span> <span class='hs-varid'>h1</span>
<a name="line-672"></a>
<a name="line-673"></a>
<a name="line-674"></a><a name="ioe_dupHandlesNotCompatible"></a><span class='hs-definition'>ioe_dupHandlesNotCompatible</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span>
<a name="line-675"></a><span class='hs-definition'>ioe_dupHandlesNotCompatible</span> <span class='hs-varid'>h</span> <span class='hs-keyglyph'>=</span>
<a name="line-676"></a>   <span class='hs-varid'>ioException</span> <span class='hs-layout'>(</span><span class='hs-conid'>IOError</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>h</span><span class='hs-layout'>)</span> <span class='hs-conid'>IllegalOperation</span> <span class='hs-str'>"hDuplicateTo"</span> 
<a name="line-677"></a>                <span class='hs-str'>"handles are incompatible"</span> <span class='hs-conid'>Nothing</span> <span class='hs-conid'>Nothing</span><span class='hs-layout'>)</span>
<a name="line-678"></a>
<a name="line-679"></a><a name="dupHandleTo"></a><span class='hs-definition'>dupHandleTo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePath</span> 
<a name="line-680"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Handle</span>
<a name="line-681"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>MVar</span> <span class='hs-conid'>Handle__</span><span class='hs-layout'>)</span>
<a name="line-682"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Handle__</span>
<a name="line-683"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Handle__</span>
<a name="line-684"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>HandleFinalizer</span>
<a name="line-685"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Handle__</span>
<a name="line-686"></a><span class='hs-definition'>dupHandleTo</span> <span class='hs-varid'>filepath</span> <span class='hs-varid'>h</span> <span class='hs-varid'>other_side</span> 
<a name="line-687"></a>            <span class='hs-varid'>hto_</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>Handle__</span><span class='hs-layout'>{</span><span class='hs-varid'>haDevice</span><span class='hs-keyglyph'>=</span><span class='hs-varid'>devTo</span><span class='hs-layout'>,</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span>
<a name="line-688"></a>            <span class='hs-varid'>h_</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>Handle__</span><span class='hs-layout'>{</span><span class='hs-varid'>haDevice</span><span class='hs-keyglyph'>=</span><span class='hs-varid'>dev</span><span class='hs-layout'>}</span> <span class='hs-varid'>mb_finalizer</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-689"></a>  <span class='hs-varid'>flushBuffer</span> <span class='hs-varid'>h_</span>
<a name="line-690"></a>  <span class='hs-keyword'>case</span> <span class='hs-varid'>cast</span> <span class='hs-varid'>devTo</span> <span class='hs-keyword'>of</span>
<a name="line-691"></a>    <span class='hs-conid'>Nothing</span>   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ioe_dupHandlesNotCompatible</span> <span class='hs-varid'>h</span>
<a name="line-692"></a>    <span class='hs-conid'>Just</span> <span class='hs-varid'>dev'</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> 
<a name="line-693"></a>      <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>IODevice</span><span class='hs-varop'>.</span><span class='hs-varid'>dup2</span> <span class='hs-varid'>dev</span> <span class='hs-varid'>dev'</span>
<a name="line-694"></a>      <span class='hs-conid'>FileHandle</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dupHandle_</span> <span class='hs-varid'>dev'</span> <span class='hs-varid'>filepath</span> <span class='hs-varid'>other_side</span> <span class='hs-varid'>h_</span> <span class='hs-varid'>mb_finalizer</span>
<a name="line-695"></a>      <span class='hs-varid'>takeMVar</span> <span class='hs-varid'>m</span>
<a name="line-696"></a>
<a name="line-697"></a><span class='hs-comment'>-- ---------------------------------------------------------------------------</span>
<a name="line-698"></a><span class='hs-comment'>-- showing Handles.</span>
<a name="line-699"></a><span class='hs-comment'>--</span>
<a name="line-700"></a><span class='hs-comment'>-- | 'hShow' is in the 'IO' monad, and gives more comprehensive output</span>
<a name="line-701"></a><span class='hs-comment'>-- than the (pure) instance of 'Show' for 'Handle'.</span>
<a name="line-702"></a>
<a name="line-703"></a><a name="hShow"></a><span class='hs-definition'>hShow</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>String</span>
<a name="line-704"></a><span class='hs-definition'>hShow</span> <span class='hs-varid'>h</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>FileHandle</span> <span class='hs-varid'>path</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>showHandle'</span> <span class='hs-varid'>path</span> <span class='hs-conid'>False</span> <span class='hs-varid'>h</span>
<a name="line-705"></a><span class='hs-definition'>hShow</span> <span class='hs-varid'>h</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>DuplexHandle</span> <span class='hs-varid'>path</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>showHandle'</span> <span class='hs-varid'>path</span> <span class='hs-conid'>True</span> <span class='hs-varid'>h</span>
<a name="line-706"></a>
<a name="line-707"></a><a name="showHandle'"></a><span class='hs-definition'>showHandle'</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Handle</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>String</span>
<a name="line-708"></a><span class='hs-definition'>showHandle'</span> <span class='hs-varid'>filepath</span> <span class='hs-varid'>is_duplex</span> <span class='hs-varid'>h</span> <span class='hs-keyglyph'>=</span> 
<a name="line-709"></a>  <span class='hs-varid'>withHandle_</span> <span class='hs-str'>"showHandle"</span> <span class='hs-varid'>h</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>hdl_</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-710"></a>    <span class='hs-keyword'>let</span>
<a name="line-711"></a>     <span class='hs-varid'>showType</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>is_duplex</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>showString</span> <span class='hs-str'>"duplex (read-write)"</span>
<a name="line-712"></a>              <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>shows</span> <span class='hs-layout'>(</span><span class='hs-varid'>haType</span> <span class='hs-varid'>hdl_</span><span class='hs-layout'>)</span>
<a name="line-713"></a>    <span class='hs-keyword'>in</span>
<a name="line-714"></a>    <span class='hs-varid'>return</span> 
<a name="line-715"></a>      <span class='hs-layout'>(</span><span class='hs-layout'>(</span> <span class='hs-varid'>showChar</span> <span class='hs-chr'>'{'</span> <span class='hs-varop'>.</span> 
<a name="line-716"></a>        <span class='hs-varid'>showHdl</span> <span class='hs-layout'>(</span><span class='hs-varid'>haType</span> <span class='hs-varid'>hdl_</span><span class='hs-layout'>)</span> 
<a name="line-717"></a>            <span class='hs-layout'>(</span><span class='hs-varid'>showString</span> <span class='hs-str'>"loc="</span> <span class='hs-varop'>.</span> <span class='hs-varid'>showString</span> <span class='hs-varid'>filepath</span> <span class='hs-varop'>.</span> <span class='hs-varid'>showChar</span> <span class='hs-chr'>','</span> <span class='hs-varop'>.</span>
<a name="line-718"></a>             <span class='hs-varid'>showString</span> <span class='hs-str'>"type="</span> <span class='hs-varop'>.</span> <span class='hs-varid'>showType</span> <span class='hs-varop'>.</span> <span class='hs-varid'>showChar</span> <span class='hs-chr'>','</span> <span class='hs-varop'>.</span>
<a name="line-719"></a>             <span class='hs-varid'>showString</span> <span class='hs-str'>"buffering="</span> <span class='hs-varop'>.</span> <span class='hs-varid'>showBufMode</span> <span class='hs-layout'>(</span><span class='hs-varid'>unsafePerformIO</span> <span class='hs-layout'>(</span><span class='hs-varid'>readIORef</span> <span class='hs-layout'>(</span><span class='hs-varid'>haCharBuffer</span> <span class='hs-varid'>hdl_</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>haBufferMode</span> <span class='hs-varid'>hdl_</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>showString</span> <span class='hs-str'>"}"</span> <span class='hs-layout'>)</span>
<a name="line-720"></a>      <span class='hs-layout'>)</span> <span class='hs-str'>""</span><span class='hs-layout'>)</span>
<a name="line-721"></a>   <span class='hs-keyword'>where</span>
<a name="line-722"></a>
<a name="line-723"></a>    <span class='hs-varid'>showHdl</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HandleType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ShowS</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ShowS</span>
<a name="line-724"></a>    <span class='hs-varid'>showHdl</span> <span class='hs-varid'>ht</span> <span class='hs-varid'>cont</span> <span class='hs-keyglyph'>=</span> 
<a name="line-725"></a>       <span class='hs-keyword'>case</span> <span class='hs-varid'>ht</span> <span class='hs-keyword'>of</span>
<a name="line-726"></a>        <span class='hs-conid'>ClosedHandle</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>shows</span> <span class='hs-varid'>ht</span> <span class='hs-varop'>.</span> <span class='hs-varid'>showString</span> <span class='hs-str'>"}"</span>
<a name="line-727"></a>        <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>cont</span>
<a name="line-728"></a>
<a name="line-729"></a>    <span class='hs-varid'>showBufMode</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Buffer</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>BufferMode</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ShowS</span>
<a name="line-730"></a>    <span class='hs-varid'>showBufMode</span> <span class='hs-varid'>buf</span> <span class='hs-varid'>bmo</span> <span class='hs-keyglyph'>=</span>
<a name="line-731"></a>      <span class='hs-keyword'>case</span> <span class='hs-varid'>bmo</span> <span class='hs-keyword'>of</span>
<a name="line-732"></a>        <span class='hs-conid'>NoBuffering</span>   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>showString</span> <span class='hs-str'>"none"</span>
<a name="line-733"></a>        <span class='hs-conid'>LineBuffering</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>showString</span> <span class='hs-str'>"line"</span>
<a name="line-734"></a>        <span class='hs-conid'>BlockBuffering</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>showString</span> <span class='hs-str'>"block "</span> <span class='hs-varop'>.</span> <span class='hs-varid'>showParen</span> <span class='hs-conid'>True</span> <span class='hs-layout'>(</span><span class='hs-varid'>shows</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>
<a name="line-735"></a>        <span class='hs-conid'>BlockBuffering</span> <span class='hs-conid'>Nothing</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>showString</span> <span class='hs-str'>"block "</span> <span class='hs-varop'>.</span> <span class='hs-varid'>showParen</span> <span class='hs-conid'>True</span> <span class='hs-layout'>(</span><span class='hs-varid'>shows</span> <span class='hs-varid'>def</span><span class='hs-layout'>)</span>
<a name="line-736"></a>      <span class='hs-keyword'>where</span>
<a name="line-737"></a>       <span class='hs-varid'>def</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> 
<a name="line-738"></a>       <span class='hs-varid'>def</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bufSize</span> <span class='hs-varid'>buf</span>
</pre></body>
</html>