Sophie

Sophie

distrib > Fedora > 14 > x86_64 > by-pkgid > 94a4f7d3ef121dc9291cc0566822165d > files > 296

ghc-MissingH-devel-1.1.0.3-2.fc14.x86_64.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>src/System/IO/HVFS.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>{-# LANGUAGE CPP, TypeSynonymInstances #-}</span>
<a name="line-2"></a><span class='hs-comment'>{- arch-tag: HVFS main file
<a name="line-3"></a>Copyright (C) 2004-2005 John Goerzen &lt;jgoerzen@complete.org&gt;
<a name="line-4"></a>
<a name="line-5"></a>This program is free software; you can redistribute it and/or modify
<a name="line-6"></a>it under the terms of the GNU General Public License as published by
<a name="line-7"></a>the Free Software Foundation; either version 2 of the License, or
<a name="line-8"></a>(at your option) any later version.
<a name="line-9"></a>
<a name="line-10"></a>This program is distributed in the hope that it will be useful,
<a name="line-11"></a>but WITHOUT ANY WARRANTY; without even the implied warranty of
<a name="line-12"></a>MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
<a name="line-13"></a>GNU General Public License for more details.
<a name="line-14"></a>
<a name="line-15"></a>You should have received a copy of the GNU General Public License
<a name="line-16"></a>along with this program; if not, write to the Free Software
<a name="line-17"></a>Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
<a name="line-18"></a>-}</span>
<a name="line-19"></a>
<a name="line-20"></a><span class='hs-comment'>{- |
<a name="line-21"></a>   Module     : System.IO.HVFS
<a name="line-22"></a>   Copyright  : Copyright (C) 2004-2005 John Goerzen
<a name="line-23"></a>   License    : GNU GPL, version 2 or above
<a name="line-24"></a>
<a name="line-25"></a>   Maintainer : John Goerzen &lt;jgoerzen@complete.org&gt; 
<a name="line-26"></a>   Stability  : provisional
<a name="line-27"></a>   Portability: portable
<a name="line-28"></a>
<a name="line-29"></a>Haskell Virtual FS -- generic support for real or virtual filesystem in Haskell
<a name="line-30"></a>
<a name="line-31"></a>Copyright (c) 2004-2005 John Goerzen, jgoerzen\@complete.org
<a name="line-32"></a>
<a name="line-33"></a>The idea of this module is to provide virtualization of filesystem calls.
<a name="line-34"></a>In addition to the \"real\" system filesystem, you can also provide access
<a name="line-35"></a>to other, virtual, filesystems using the same set of calls.  Examples of
<a name="line-36"></a>such virtual filesystems might include a remote FTP server, WebDAV server,
<a name="line-37"></a>a local Hashtable, a ConfigParser object, or any other data structure
<a name="line-38"></a>you can represent as a tree of named nodes containing strings.
<a name="line-39"></a>
<a name="line-40"></a>Each 'HVFS' function takes a 'HVFS' \"handle\" ('HVFS' instance) as its
<a name="line-41"></a>first parameter.  If you wish to operate on the standard system filesystem,
<a name="line-42"></a>you can just use 'SystemFS'.
<a name="line-43"></a>
<a name="line-44"></a>The "MissingH.HVFS.IO.InstanceHelpers" module contains some code to help
<a name="line-45"></a>you make your own HVFS instances.
<a name="line-46"></a>
<a name="line-47"></a>The 'HVFSOpenable' class works together with the "System.IO.HVIO" module
<a name="line-48"></a>to provide a complete virtual filesystem and I\/O model that allows you
<a name="line-49"></a>to open up virtual filesystem files and act upon them in a manner similar
<a name="line-50"></a>to standard Handles.
<a name="line-51"></a>-}</span>
<a name="line-52"></a>
<a name="line-53"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span><span class='hs-varop'>.</span><span class='hs-conid'>HVFS</span><span class='hs-layout'>(</span><span class='hs-comment'>-- * Implementation Classes \/ Types</span>
<a name="line-54"></a>                        <span class='hs-conid'>HVFS</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'>HVFSStat</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> 
<a name="line-55"></a>                        <span class='hs-conid'>HVFSOpenable</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'>HVFSOpenEncap</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'>HVFSStatEncap</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-56"></a>                        <span class='hs-varid'>withStat</span><span class='hs-layout'>,</span> <span class='hs-varid'>withOpen</span><span class='hs-layout'>,</span>
<a name="line-57"></a>                        <span class='hs-conid'>SystemFS</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-58"></a>                        <span class='hs-comment'>-- * Re-exported types from other modules</span>
<a name="line-59"></a>                        <span class='hs-conid'>FilePath</span><span class='hs-layout'>,</span> <span class='hs-conid'>DeviceID</span><span class='hs-layout'>,</span> <span class='hs-conid'>FileID</span><span class='hs-layout'>,</span> <span class='hs-conid'>FileMode</span><span class='hs-layout'>,</span> <span class='hs-conid'>LinkCount</span><span class='hs-layout'>,</span>
<a name="line-60"></a>                        <span class='hs-conid'>UserID</span><span class='hs-layout'>,</span> <span class='hs-conid'>GroupID</span><span class='hs-layout'>,</span> <span class='hs-conid'>FileOffset</span><span class='hs-layout'>,</span> <span class='hs-conid'>EpochTime</span><span class='hs-layout'>,</span>
<a name="line-61"></a>                        <span class='hs-conid'>IOMode</span>
<a name="line-62"></a>                    <span class='hs-layout'>)</span>
<a name="line-63"></a><span class='hs-keyword'>where</span>
<a name="line-64"></a>
<a name="line-65"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span><span class='hs-varop'>.</span><span class='hs-conid'>HVIO</span>
<a name="line-66"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>Time</span><span class='hs-varop'>.</span><span class='hs-conid'>Utils</span>
<a name="line-67"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span>
<a name="line-68"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span><span class='hs-varop'>.</span><span class='hs-conid'>Error</span>
<a name="line-69"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span><span class='hs-varop'>.</span><span class='hs-conid'>PlafCompat</span>
<a name="line-70"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>Posix</span><span class='hs-varop'>.</span><span class='hs-conid'>Types</span>
<a name="line-71"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>Time</span>
<a name="line-72"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>Directory</span>
<a name="line-73"></a>
<a name="line-74"></a><a name="HVFSStatEncap"></a><span class='hs-comment'>{- | Encapsulate a 'HVFSStat' result.  This is required due to Haskell
<a name="line-75"></a>typing restrictions.  You can get at it with:
<a name="line-76"></a>
<a name="line-77"></a>&gt; case encap of
<a name="line-78"></a>&gt;    HVFSStatEncap x -&gt; -- now use x
<a name="line-79"></a>-}</span>
<a name="line-80"></a><a name="HVFSStatEncap"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>HVFSStatEncap</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>forall</span> <span class='hs-varid'>a</span><span class='hs-varop'>.</span> <span class='hs-conid'>HVFSStat</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>HVFSStatEncap</span> <span class='hs-varid'>a</span>
<a name="line-81"></a>
<a name="line-82"></a><a name="withStat"></a><span class='hs-comment'>{- | Convenience function for working with stat -- takes a stat result
<a name="line-83"></a>and a function that uses it, and returns the result. 
<a name="line-84"></a>
<a name="line-85"></a>Here is an example from the HVFS source:
<a name="line-86"></a>
<a name="line-87"></a>&gt;    vGetModificationTime fs fp = 
<a name="line-88"></a>&gt;       do s &lt;- vGetFileStatus fs fp
<a name="line-89"></a>&gt;          return $ epochToClockTime (withStat s vModificationTime)
<a name="line-90"></a>
<a name="line-91"></a>See 'System.Time.Utils.epochToClockTime' for more information.
<a name="line-92"></a>-}</span>
<a name="line-93"></a><span class='hs-definition'>withStat</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyword'>forall</span> <span class='hs-varid'>b</span><span class='hs-varop'>.</span> <span class='hs-conid'>HVFSStatEncap</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyword'>forall</span> <span class='hs-varid'>a</span><span class='hs-varop'>.</span> <span class='hs-conid'>HVFSStat</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span>
<a name="line-94"></a><span class='hs-definition'>withStat</span> <span class='hs-varid'>s</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span>
<a name="line-95"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>s</span> <span class='hs-keyword'>of</span>
<a name="line-96"></a>           <span class='hs-conid'>HVFSStatEncap</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span>
<a name="line-97"></a>
<a name="line-98"></a><a name="HVFSOpenEncap"></a><span class='hs-comment'>{- | Similar to 'HVFSStatEncap', but for 'vOpen' result.
<a name="line-99"></a>-}</span>
<a name="line-100"></a><a name="HVFSOpenEncap"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>HVFSOpenEncap</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>forall</span> <span class='hs-varid'>a</span><span class='hs-varop'>.</span> <span class='hs-conid'>HVIO</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>HVFSOpenEncap</span> <span class='hs-varid'>a</span>
<a name="line-101"></a>
<a name="line-102"></a><a name="withOpen"></a><span class='hs-comment'>{- | Similar to 'withStat', but for the 'vOpen' result. -}</span>
<a name="line-103"></a><span class='hs-definition'>withOpen</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyword'>forall</span> <span class='hs-varid'>b</span><span class='hs-varop'>.</span> <span class='hs-conid'>HVFSOpenEncap</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyword'>forall</span> <span class='hs-varid'>a</span><span class='hs-varop'>.</span> <span class='hs-conid'>HVIO</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span>
<a name="line-104"></a><span class='hs-definition'>withOpen</span> <span class='hs-varid'>s</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span>
<a name="line-105"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>s</span> <span class='hs-keyword'>of</span>
<a name="line-106"></a>           <span class='hs-conid'>HVFSOpenEncap</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span>
<a name="line-107"></a>
<a name="line-108"></a><span class='hs-comment'>{- | Evaluating types of files and information about them.
<a name="line-109"></a>
<a name="line-110"></a>This corresponds to the System.Posix.Types.FileStatus type, and indeed,
<a name="line-111"></a>that is one instance of this class.
<a name="line-112"></a>
<a name="line-113"></a>Inplementators must, at minimum, implement 'vIsDirectory' and
<a name="line-114"></a>'vIsRegularFile'.
<a name="line-115"></a>
<a name="line-116"></a>Default implementations of everything else are provided, returning
<a name="line-117"></a>reasonable values.
<a name="line-118"></a>
<a name="line-119"></a>A default implementation of this is not currently present on Windows.
<a name="line-120"></a>-}</span>
<a name="line-121"></a>
<a name="line-122"></a><a name="HVFSStat"></a><span class='hs-keyword'>class</span> <span class='hs-layout'>(</span><span class='hs-conid'>Show</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>HVFSStat</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>where</span>
<a name="line-123"></a>    <span class='hs-varid'>vDeviceID</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>DeviceID</span>
<a name="line-124"></a>    <span class='hs-varid'>vFileID</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FileID</span>
<a name="line-125"></a>
<a name="line-126"></a>    <span class='hs-comment'>{- | Refers to file permissions, NOT the st_mode field from stat(2) -}</span>
<a name="line-127"></a>    <span class='hs-varid'>vFileMode</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FileMode</span>
<a name="line-128"></a>
<a name="line-129"></a>    <span class='hs-varid'>vLinkCount</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LinkCount</span>
<a name="line-130"></a>    <span class='hs-varid'>vFileOwner</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>UserID</span>
<a name="line-131"></a>    <span class='hs-varid'>vFileGroup</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>GroupID</span>
<a name="line-132"></a>
<a name="line-133"></a>    <span class='hs-varid'>vSpecialDeviceID</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>DeviceID</span>
<a name="line-134"></a>    <span class='hs-varid'>vFileSize</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FileOffset</span>
<a name="line-135"></a>    <span class='hs-varid'>vAccessTime</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>EpochTime</span>
<a name="line-136"></a>    <span class='hs-varid'>vModificationTime</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>EpochTime</span>
<a name="line-137"></a>    <span class='hs-varid'>vStatusChangeTime</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>EpochTime</span>
<a name="line-138"></a>    <span class='hs-varid'>vIsBlockDevice</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-139"></a>    <span class='hs-varid'>vIsCharacterDevice</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-140"></a>    <span class='hs-varid'>vIsNamedPipe</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-141"></a>    <span class='hs-varid'>vIsRegularFile</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-142"></a>    <span class='hs-varid'>vIsDirectory</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-143"></a>    <span class='hs-varid'>vIsSymbolicLink</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-144"></a>    <span class='hs-varid'>vIsSocket</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-145"></a>
<a name="line-146"></a>    <span class='hs-varid'>vDeviceID</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
<a name="line-147"></a>    <span class='hs-varid'>vFileID</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
<a name="line-148"></a>    <span class='hs-varid'>vFileMode</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>vIsDirectory</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>then</span> <span class='hs-num'>0x755</span> <span class='hs-keyword'>else</span> <span class='hs-num'>0o0644</span>
<a name="line-149"></a>    <span class='hs-varid'>vLinkCount</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span>
<a name="line-150"></a>    <span class='hs-varid'>vFileOwner</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
<a name="line-151"></a>    <span class='hs-varid'>vFileGroup</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
<a name="line-152"></a>    <span class='hs-varid'>vSpecialDeviceID</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
<a name="line-153"></a>    <span class='hs-varid'>vFileSize</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
<a name="line-154"></a>    <span class='hs-varid'>vAccessTime</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
<a name="line-155"></a>    <span class='hs-varid'>vModificationTime</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
<a name="line-156"></a>    <span class='hs-varid'>vStatusChangeTime</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
<a name="line-157"></a>    <span class='hs-varid'>vIsBlockDevice</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-158"></a>    <span class='hs-varid'>vIsCharacterDevice</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-159"></a>    <span class='hs-varid'>vIsNamedPipe</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-160"></a>    <span class='hs-varid'>vIsSymbolicLink</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-161"></a>    <span class='hs-varid'>vIsSocket</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-162"></a>
<a name="line-163"></a><a name="HVFS"></a><span class='hs-comment'>{- | The main HVFS class.
<a name="line-164"></a>
<a name="line-165"></a>Default implementations of these functions are provided:
<a name="line-166"></a>
<a name="line-167"></a> * 'vGetModificationTime' -- implemented in terms of 'vGetFileStatus'
<a name="line-168"></a>
<a name="line-169"></a> * 'vRaiseError'
<a name="line-170"></a>
<a name="line-171"></a> * 'vDoesFileExist' -- implemented in terms of 'vGetFileStatus'
<a name="line-172"></a>
<a name="line-173"></a> * 'vDoesDirectoryExist' -- implemented in terms of 'vGetFileStatus'
<a name="line-174"></a>
<a name="line-175"></a> * 'vDoesExist' -- implemented in terms of 'vGetSymbolicLinkStatus'
<a name="line-176"></a>
<a name="line-177"></a> * 'vGetSymbolicLinkStatus' -- set to call 'vGetFileStatus'.
<a name="line-178"></a>
<a name="line-179"></a>Default implementations of all other functions
<a name="line-180"></a>will generate an isIllegalOperation error, since they are assumed to be
<a name="line-181"></a>un-implemented.
<a name="line-182"></a>
<a name="line-183"></a>You should always provide at least a 'vGetFileStatus' call, and almost
<a name="line-184"></a>certainly several of the others.
<a name="line-185"></a>
<a name="line-186"></a>Most of these functions correspond to functions in System.Directory or
<a name="line-187"></a>System.Posix.Files.  Please see detailed documentation on them there.
<a name="line-188"></a> -}</span>
<a name="line-189"></a><a name="HVFS"></a><span class='hs-keyword'>class</span> <span class='hs-layout'>(</span><span class='hs-conid'>Show</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>HVFS</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>where</span>
<a name="line-190"></a>    <span class='hs-varid'>vGetCurrentDirectory</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>FilePath</span>
<a name="line-191"></a>    <span class='hs-varid'>vSetCurrentDirectory</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-192"></a>    <span class='hs-varid'>vGetDirectoryContents</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>FilePath</span><span class='hs-keyglyph'>]</span>
<a name="line-193"></a>    <span class='hs-varid'>vDoesFileExist</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Bool</span>
<a name="line-194"></a>    <span class='hs-varid'>vDoesDirectoryExist</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Bool</span>
<a name="line-195"></a>    <span class='hs-comment'>{- | True if the file exists, regardless of what type it is.
<a name="line-196"></a>       This is even True if the given path is a broken symlink. -}</span>
<a name="line-197"></a>    <span class='hs-varid'>vDoesExist</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>Bool</span>
<a name="line-198"></a>    <span class='hs-varid'>vCreateDirectory</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</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-varid'>vRemoveDirectory</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-200"></a>    <span class='hs-varid'>vRenameDirectory</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-201"></a>    <span class='hs-varid'>vRemoveFile</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-202"></a>    <span class='hs-varid'>vRenameFile</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-203"></a>    <span class='hs-varid'>vGetFileStatus</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>HVFSStatEncap</span>
<a name="line-204"></a>    <span class='hs-varid'>vGetSymbolicLinkStatus</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>HVFSStatEncap</span>
<a name="line-205"></a>    <span class='hs-varid'>vGetModificationTime</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>ClockTime</span>
<a name="line-206"></a>    <span class='hs-comment'>{- | Raise an error relating to actions on this class. -}</span>
<a name="line-207"></a>    <span class='hs-varid'>vRaiseError</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IOErrorType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>c</span>
<a name="line-208"></a>    <span class='hs-varid'>vCreateSymbolicLink</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-209"></a>    <span class='hs-varid'>vReadSymbolicLink</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>FilePath</span>
<a name="line-210"></a>    <span class='hs-varid'>vCreateLink</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-211"></a>
<a name="line-212"></a>    <span class='hs-varid'>vGetModificationTime</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>fp</span> <span class='hs-keyglyph'>=</span> 
<a name="line-213"></a>        <span class='hs-keyword'>do</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>vGetFileStatus</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>fp</span>
<a name="line-214"></a>           <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>epochToClockTime</span> <span class='hs-layout'>(</span><span class='hs-varid'>withStat</span> <span class='hs-varid'>s</span> <span class='hs-varid'>vModificationTime</span><span class='hs-layout'>)</span>
<a name="line-215"></a>    <span class='hs-varid'>vRaiseError</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>et</span> <span class='hs-varid'>desc</span> <span class='hs-varid'>mfp</span> <span class='hs-keyglyph'>=</span>
<a name="line-216"></a>        <span class='hs-varid'>ioError</span> <span class='hs-varop'>$</span> <span class='hs-varid'>mkIOError</span> <span class='hs-varid'>et</span> <span class='hs-varid'>desc</span> <span class='hs-conid'>Nothing</span> <span class='hs-varid'>mfp</span>
<a name="line-217"></a>
<a name="line-218"></a>    <span class='hs-varid'>vGetCurrentDirectory</span> <span class='hs-varid'>fs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>eh</span> <span class='hs-varid'>fs</span> <span class='hs-str'>"vGetCurrentDirectory"</span>
<a name="line-219"></a>    <span class='hs-varid'>vSetCurrentDirectory</span> <span class='hs-varid'>fs</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>eh</span> <span class='hs-varid'>fs</span> <span class='hs-str'>"vSetCurrentDirectory"</span>
<a name="line-220"></a>    <span class='hs-varid'>vGetDirectoryContents</span> <span class='hs-varid'>fs</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>eh</span> <span class='hs-varid'>fs</span> <span class='hs-str'>"vGetDirectoryContents"</span>
<a name="line-221"></a>    <span class='hs-varid'>vDoesFileExist</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>fp</span> <span class='hs-keyglyph'>=</span> 
<a name="line-222"></a>        <span class='hs-varid'>catch</span> <span class='hs-layout'>(</span><span class='hs-keyword'>do</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>vGetFileStatus</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>fp</span>
<a name="line-223"></a>                  <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>withStat</span> <span class='hs-varid'>s</span> <span class='hs-varid'>vIsRegularFile</span>
<a name="line-224"></a>              <span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>False</span><span class='hs-layout'>)</span>
<a name="line-225"></a>    <span class='hs-varid'>vDoesDirectoryExist</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>fp</span> <span class='hs-keyglyph'>=</span> 
<a name="line-226"></a>        <span class='hs-varid'>catch</span> <span class='hs-layout'>(</span><span class='hs-keyword'>do</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>vGetFileStatus</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>fp</span>
<a name="line-227"></a>                  <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>withStat</span> <span class='hs-varid'>s</span> <span class='hs-varid'>vIsDirectory</span>
<a name="line-228"></a>              <span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>False</span><span class='hs-layout'>)</span>
<a name="line-229"></a>    <span class='hs-varid'>vDoesExist</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>fp</span> <span class='hs-keyglyph'>=</span>
<a name="line-230"></a>        <span class='hs-varid'>catch</span> <span class='hs-layout'>(</span><span class='hs-keyword'>do</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>vGetSymbolicLinkStatus</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>fp</span>
<a name="line-231"></a>                  <span class='hs-varid'>return</span> <span class='hs-conid'>True</span>
<a name="line-232"></a>              <span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>False</span><span class='hs-layout'>)</span>
<a name="line-233"></a>    <span class='hs-varid'>vCreateDirectory</span> <span class='hs-varid'>fs</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>eh</span> <span class='hs-varid'>fs</span> <span class='hs-str'>"vCreateDirectory"</span>
<a name="line-234"></a>    <span class='hs-varid'>vRemoveDirectory</span> <span class='hs-varid'>fs</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>eh</span> <span class='hs-varid'>fs</span> <span class='hs-str'>"vRemoveDirectory"</span>
<a name="line-235"></a>    <span class='hs-varid'>vRemoveFile</span> <span class='hs-varid'>fs</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>eh</span> <span class='hs-varid'>fs</span> <span class='hs-str'>"vRemoveFile"</span>
<a name="line-236"></a>    <span class='hs-varid'>vRenameFile</span> <span class='hs-varid'>fs</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>eh</span> <span class='hs-varid'>fs</span> <span class='hs-str'>"vRenameFile"</span>
<a name="line-237"></a>    <span class='hs-varid'>vRenameDirectory</span> <span class='hs-varid'>fs</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>eh</span> <span class='hs-varid'>fs</span> <span class='hs-str'>"vRenameDirectory"</span>
<a name="line-238"></a>    <span class='hs-varid'>vCreateSymbolicLink</span> <span class='hs-varid'>fs</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>eh</span> <span class='hs-varid'>fs</span> <span class='hs-str'>"vCreateSymbolicLink"</span>
<a name="line-239"></a>    <span class='hs-varid'>vReadSymbolicLink</span> <span class='hs-varid'>fs</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>eh</span> <span class='hs-varid'>fs</span> <span class='hs-str'>"vReadSymbolicLink"</span>
<a name="line-240"></a>    <span class='hs-varid'>vCreateLink</span> <span class='hs-varid'>fs</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>eh</span> <span class='hs-varid'>fs</span> <span class='hs-str'>"vCreateLink"</span>
<a name="line-241"></a>    <span class='hs-varid'>vGetSymbolicLinkStatus</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>vGetFileStatus</span>
<a name="line-242"></a>
<a name="line-243"></a><a name="eh"></a><span class='hs-comment'>-- | Error handler helper</span>
<a name="line-244"></a><span class='hs-definition'>eh</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HVFS</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>c</span>
<a name="line-245"></a><span class='hs-definition'>eh</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>desc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>vRaiseError</span> <span class='hs-varid'>fs</span> <span class='hs-varid'>illegalOperationErrorType</span> 
<a name="line-246"></a>             <span class='hs-layout'>(</span><span class='hs-varid'>desc</span> <span class='hs-varop'>++</span> <span class='hs-str'>" is not implemented in this HVFS class"</span><span class='hs-layout'>)</span> <span class='hs-conid'>Nothing</span>
<a name="line-247"></a>
<a name="line-248"></a><span class='hs-comment'>{- | Types that can open a HVIO object should be instances of this class.
<a name="line-249"></a>You need only implement 'vOpen'. -}</span>
<a name="line-250"></a>
<a name="line-251"></a><a name="HVFSOpenable"></a><span class='hs-keyword'>class</span> <span class='hs-conid'>HVFS</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>HVFSOpenable</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>where</span>
<a name="line-252"></a>    <span class='hs-varid'>vOpen</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IOMode</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>HVFSOpenEncap</span>
<a name="line-253"></a>    <span class='hs-varid'>vReadFile</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>String</span>
<a name="line-254"></a>    <span class='hs-varid'>vWriteFile</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-255"></a>    <span class='hs-varid'>vOpenBinaryFile</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IOMode</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>HVFSOpenEncap</span>
<a name="line-256"></a>
<a name="line-257"></a>    <span class='hs-varid'>vReadFile</span> <span class='hs-varid'>h</span> <span class='hs-varid'>fp</span> <span class='hs-keyglyph'>=</span> 
<a name="line-258"></a>        <span class='hs-keyword'>do</span> <span class='hs-varid'>oe</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>vOpen</span> <span class='hs-varid'>h</span> <span class='hs-varid'>fp</span> <span class='hs-conid'>ReadMode</span>
<a name="line-259"></a>           <span class='hs-varid'>withOpen</span> <span class='hs-varid'>oe</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>fh</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>vGetContents</span> <span class='hs-varid'>fh</span><span class='hs-layout'>)</span>
<a name="line-260"></a>
<a name="line-261"></a>    <span class='hs-varid'>vWriteFile</span> <span class='hs-varid'>h</span> <span class='hs-varid'>fp</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span>
<a name="line-262"></a>        <span class='hs-keyword'>do</span> <span class='hs-varid'>oe</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>vOpen</span> <span class='hs-varid'>h</span> <span class='hs-varid'>fp</span> <span class='hs-conid'>WriteMode</span>
<a name="line-263"></a>           <span class='hs-varid'>withOpen</span> <span class='hs-varid'>oe</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>fh</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>vPutStr</span> <span class='hs-varid'>fh</span> <span class='hs-varid'>s</span>
<a name="line-264"></a>                                  <span class='hs-varid'>vClose</span> <span class='hs-varid'>fh</span><span class='hs-layout'>)</span>
<a name="line-265"></a>
<a name="line-266"></a>    <span class='hs-comment'>-- | Open a file in binary mode.</span>
<a name="line-267"></a>    <span class='hs-varid'>vOpenBinaryFile</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>vOpen</span>
<a name="line-268"></a>
<a name="line-269"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Show</span> <span class='hs-conid'>FileStatus</span> <span class='hs-keyword'>where</span>
<a name="line-270"></a>    <span class='hs-varid'>show</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"&lt;FileStatus&gt;"</span>
<a name="line-271"></a>
<a name="line-272"></a><span class='hs-comment'>----------------------------------------------------------------------</span>
<a name="line-273"></a><span class='hs-comment'>-- Standard implementations</span>
<a name="line-274"></a><span class='hs-comment'>----------------------------------------------------------------------</span>
<a name="line-275"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>HVFSStat</span> <span class='hs-conid'>FileStatus</span> <span class='hs-keyword'>where</span>
<a name="line-276"></a>    <span class='hs-varid'>vDeviceID</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>deviceID</span>
<a name="line-277"></a>    <span class='hs-varid'>vFileID</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fileID</span>
<a name="line-278"></a>    <span class='hs-varid'>vFileMode</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fileMode</span>
<a name="line-279"></a>    <span class='hs-varid'>vLinkCount</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>linkCount</span>
<a name="line-280"></a>    <span class='hs-varid'>vFileOwner</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fileOwner</span>
<a name="line-281"></a>    <span class='hs-varid'>vFileGroup</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fileGroup</span>
<a name="line-282"></a>    <span class='hs-varid'>vSpecialDeviceID</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>specialDeviceID</span>
<a name="line-283"></a>    <span class='hs-varid'>vFileSize</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fileSize</span>
<a name="line-284"></a>    <span class='hs-varid'>vAccessTime</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>accessTime</span>
<a name="line-285"></a>    <span class='hs-varid'>vModificationTime</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modificationTime</span>
<a name="line-286"></a>    <span class='hs-varid'>vStatusChangeTime</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>statusChangeTime</span>
<a name="line-287"></a>    <span class='hs-varid'>vIsBlockDevice</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isBlockDevice</span>
<a name="line-288"></a>    <span class='hs-varid'>vIsCharacterDevice</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isCharacterDevice</span>
<a name="line-289"></a>    <span class='hs-varid'>vIsNamedPipe</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isNamedPipe</span>
<a name="line-290"></a>    <span class='hs-varid'>vIsRegularFile</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isRegularFile</span>
<a name="line-291"></a>    <span class='hs-varid'>vIsDirectory</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isDirectory</span>
<a name="line-292"></a>    <span class='hs-varid'>vIsSymbolicLink</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isSymbolicLink</span>
<a name="line-293"></a>    <span class='hs-varid'>vIsSocket</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isSocket</span>
<a name="line-294"></a>
<a name="line-295"></a><a name="SystemFS"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>SystemFS</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SystemFS</span>
<a name="line-296"></a>              <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>)</span>
<a name="line-297"></a>
<a name="line-298"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>HVFS</span> <span class='hs-conid'>SystemFS</span> <span class='hs-keyword'>where</span>
<a name="line-299"></a>    <span class='hs-varid'>vGetCurrentDirectory</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getCurrentDirectory</span>
<a name="line-300"></a>    <span class='hs-varid'>vSetCurrentDirectory</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>setCurrentDirectory</span>
<a name="line-301"></a>    <span class='hs-varid'>vGetDirectoryContents</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getDirectoryContents</span>
<a name="line-302"></a>    <span class='hs-varid'>vDoesFileExist</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>doesFileExist</span>
<a name="line-303"></a>    <span class='hs-varid'>vDoesDirectoryExist</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>doesDirectoryExist</span>
<a name="line-304"></a>    <span class='hs-varid'>vCreateDirectory</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>createDirectory</span>
<a name="line-305"></a>    <span class='hs-varid'>vRemoveDirectory</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>removeDirectory</span>
<a name="line-306"></a>    <span class='hs-varid'>vRenameDirectory</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>renameDirectory</span>
<a name="line-307"></a>    <span class='hs-varid'>vRemoveFile</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>removeFile</span>
<a name="line-308"></a>    <span class='hs-varid'>vRenameFile</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>renameFile</span>
<a name="line-309"></a>    <span class='hs-varid'>vGetFileStatus</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>fp</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getFileStatus</span> <span class='hs-varid'>fp</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>return</span> <span class='hs-varop'>.</span> <span class='hs-conid'>HVFSStatEncap</span>
<a name="line-310"></a><span class='hs-cpp'>#if !(defined(mingw32_HOST_OS) || defined(mingw32_TARGET_OS) || defined(__MINGW32__))</span>
<a name="line-311"></a>    <span class='hs-varid'>vGetSymbolicLinkStatus</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>fp</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getSymbolicLinkStatus</span> <span class='hs-varid'>fp</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>return</span> <span class='hs-varop'>.</span> <span class='hs-conid'>HVFSStatEncap</span>
<a name="line-312"></a><span class='hs-cpp'>#else</span>
<a name="line-313"></a>    <span class='hs-comment'>-- No symlinks on Windows; just get the file status directly</span>
<a name="line-314"></a>    <span class='hs-varid'>vGetSymbolicLinkStatus</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>vGetFileStatus</span>
<a name="line-315"></a><span class='hs-cpp'>#endif</span>
<a name="line-316"></a>
<a name="line-317"></a>    <span class='hs-varid'>vGetModificationTime</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getModificationTime</span>
<a name="line-318"></a><span class='hs-cpp'>#if !(defined(mingw32_HOST_OS) || defined(mingw32_TARGET_OS) || defined(__MINGW32__))</span>
<a name="line-319"></a>    <span class='hs-varid'>vCreateSymbolicLink</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>createSymbolicLink</span>
<a name="line-320"></a>    <span class='hs-varid'>vReadSymbolicLink</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readSymbolicLink</span>
<a name="line-321"></a>    <span class='hs-varid'>vCreateLink</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>createLink</span>
<a name="line-322"></a><span class='hs-cpp'>#else</span>
<a name="line-323"></a>    <span class='hs-varid'>vCreateSymbolicLink</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fail</span> <span class='hs-str'>"Symbolic link creation not supported by Windows"</span>
<a name="line-324"></a>    <span class='hs-varid'>vReadSymbolicLink</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fail</span> <span class='hs-str'>"Symbolic link reading not supported by Widnows"</span>
<a name="line-325"></a>    <span class='hs-varid'>vCreateLink</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fail</span> <span class='hs-str'>"Hard link creation not supported by Windows"</span>
<a name="line-326"></a><span class='hs-cpp'>#endif</span>
<a name="line-327"></a>
<a name="line-328"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>HVFSOpenable</span> <span class='hs-conid'>SystemFS</span> <span class='hs-keyword'>where</span>
<a name="line-329"></a>    <span class='hs-varid'>vOpen</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>fp</span> <span class='hs-varid'>iomode</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>openFile</span> <span class='hs-varid'>fp</span> <span class='hs-varid'>iomode</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>return</span> <span class='hs-varop'>.</span> <span class='hs-conid'>HVFSOpenEncap</span>
<a name="line-330"></a>    <span class='hs-varid'>vOpenBinaryFile</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>fp</span> <span class='hs-varid'>iomode</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>openBinaryFile</span> <span class='hs-varid'>fp</span> <span class='hs-varid'>iomode</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>return</span> <span class='hs-varop'>.</span> <span class='hs-conid'>HVFSOpenEncap</span>
<a name="line-331"></a>
</pre></body>
</html>