switch to new Haddock-generated library docs
authorSimon Marlow <marlowsd@gmail.com>
Tue, 29 Jun 2010 14:08:41 +0000 (14:08 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Tue, 29 Jun 2010 14:08:41 +0000 (14:08 +0000)
56 files changed:
report/Makefile
report/array.verb [deleted file]
report/char.verb [deleted file]
report/complex.verb [deleted file]
report/cputime.verb [deleted file]
report/directory.verb [deleted file]
report/haddock-style.verb [new file with mode: 0644]
report/haskell-prime-draft.html [deleted file]
report/haskell.verb
report/ht/haddock-style.tex [new file with mode: 0644]
report/ht/haskell.cfg
report/html.config [deleted file]
report/io.verb [deleted file]
report/ix.verb [deleted file]
report/lib-code/Array.hs [deleted file]
report/lib-code/Char.hs [deleted file]
report/lib-code/Complex.hs [deleted file]
report/lib-code/IO.hs [deleted file]
report/lib-code/Ix.hs [deleted file]
report/lib-code/List.hs [deleted file]
report/lib-code/Locale.hs [deleted file]
report/lib-code/Maybe.hs [deleted file]
report/lib-code/Monad.hs [deleted file]
report/lib-code/Numeric.hs [deleted file]
report/lib-code/Random.hs [deleted file]
report/lib-code/Ratio.hs [deleted file]
report/lib-code/Time.hs [deleted file]
report/lib-hdrs/Array.hs [deleted file]
report/lib-hdrs/CPUTime.hs [deleted file]
report/lib-hdrs/Char.hs [deleted file]
report/lib-hdrs/Complex.hs [deleted file]
report/lib-hdrs/Directory.hs [deleted file]
report/lib-hdrs/IO.hs [deleted file]
report/lib-hdrs/IO1.hs [deleted file]
report/lib-hdrs/Ix.hs [deleted file]
report/lib-hdrs/List.hs [deleted file]
report/lib-hdrs/List1.hs [deleted file]
report/lib-hdrs/Locale.hs [deleted file]
report/lib-hdrs/Maybe.hs [deleted file]
report/lib-hdrs/Monad.hs [deleted file]
report/lib-hdrs/Numeric.hs [deleted file]
report/lib-hdrs/Random.hs [deleted file]
report/lib-hdrs/Ratio.hs [deleted file]
report/lib-hdrs/System.hs [deleted file]
report/lib-hdrs/Time.hs [deleted file]
report/lib-hdrs/Time1.hs [deleted file]
report/list.verb [deleted file]
report/locale.verb [deleted file]
report/maybe.verb [deleted file]
report/monad.verb [deleted file]
report/numeric.verb [deleted file]
report/prelude-index.idx [deleted file]
report/random.verb [deleted file]
report/ratio.verb [deleted file]
report/system.verb [deleted file]
report/time.verb [deleted file]

index 5b42a41..cf1a55d 100644 (file)
@@ -7,12 +7,14 @@
 ##########################################
 # What to make if you type 'make'
 
-default: haskell.pdf html
+default: pdf html
+
+.PHONY: pdf
+pdf : haskell.pdf
 
 # Begin by saying
 #      touch haskell.idx
 
-
 #########################################
 #      Tools you need
 #########################################
@@ -55,37 +57,49 @@ PARTS_NO_PREFACE = iso-chars.tex \
                derived.tex \
                index-extra.tex index-intro.tex layout.tex fixity.tex \
                literate.tex pragmas.tex standard-prelude.tex \
-               ratio.tex complex.tex ix.tex \
-                numeric.tex \
-                array.tex io.tex char.tex monad.tex list.tex \
-                system.tex directory.tex \
-                maybe.tex time.tex cputime.tex random.tex \
-               locale.tex syntax-lexical.tex syntax-iso.tex ffi.tex \
+               syntax-lexical.tex syntax-iso.tex ffi.tex \
                Prelude.tex PreludeList.tex PreludeText.tex PreludeIO.tex \
-               lib-marshal.tex \
-               lib-cerror.tex     lib-data-intword.tex  lib-marshalerror.tex \
-               lib-cforeign.tex   lib-foreignptr.tex    lib-marshalutils.tex \
-               lib-cstring.tex    lib-foreign.tex       lib-ptr.tex \
-               lib-ctypes.tex     lib-marshalalloc.tex  lib-stableptr.tex \
-               lib-data-bits.tex  lib-marshalarray.tex  lib-storable.tex
-
-CODE =         lib-code/Ratio.tex lib-code/Complex.tex lib-code/Ix.tex \
-                lib-code/Numeric.tex \
-                lib-code/Array.tex lib-code/Char.tex lib-code/List.tex \
-                lib-code/Monad.tex lib-code/Maybe.tex lib-code/IO.tex \
-               lib-code/Time.tex lib-code/Locale.tex
-
-HEADERS =      lib-hdrs/Ratio.tex lib-hdrs/Complex.tex lib-hdrs/Ix.tex \
-                lib-hdrs/Numeric.tex \
-                lib-hdrs/Array.tex lib-hdrs/IO.tex lib-hdrs/Char.tex \
-               lib-hdrs/List.tex lib-hdrs/List1.tex \
-                lib-hdrs/Monad.tex lib-hdrs/System.tex lib-hdrs/Directory.tex \
-                lib-hdrs/Maybe.tex lib-hdrs/IO1.tex lib-hdrs/Random.tex \
-               lib-hdrs/Time.tex lib-hdrs/Time1.tex lib-hdrs/CPUTime.tex \
-               lib-hdrs/Locale.tex 
+               $(LIB_TEX)
+
+LIB_MODULES = Data.Array \
+       Data.Char \
+       Data.Complex \
+       System.IO \
+       System.IO.Error \
+       Data.Ix \
+       Data.List \
+       Data.Maybe \
+       Control.Monad \
+       Data.Ratio \
+       System.Environment \
+       System.Exit \
+       Data.Int \
+       Data.Word \
+       Data.Bits \
+       Foreign \
+       Foreign.Ptr \
+       Foreign.ForeignPtr \
+       Foreign.StablePtr \
+       Foreign.Storable \
+       Foreign.C \
+       Foreign.C.Error \
+       Foreign.C.String \
+       Foreign.C.Types \
+       Foreign.Marshal \
+       Foreign.Marshal.Alloc \
+       Foreign.Marshal.Array \
+       Foreign.Marshal.Error \
+       Foreign.Marshal.Utils
+
+HADDOCK_ODIR = libs
+
+LIB_TEX = $(patsubst %, $(HADDOCK_ODIR)/%, $(addsuffix .tex, $(subst .,-,$(LIB_MODULES))))
 
 HT_TEXS = $(patsubst %, ht/%, $(PARTS))
 
+show:
+       @echo '$(VALUE)="$($(VALUE))"'
+
 #########################################
 #      Main targets
 #########################################
@@ -105,8 +119,8 @@ haskell.tex: haskell.verb
 #      $(RUN_INDEX)
 #      cp index.html *.png *.gif haskell-report-html
 
-haskell.dvi: haskell.tex haskell.ind ${PARTS} ${CODE} ${HEADERS}
-haskell.pdf: haskell.tex haskell.ind ${PARTS} ${CODE} ${HEADERS}
+haskell.dvi: haskell.tex haskell.ind ${PARTS}
+haskell.pdf: haskell.tex haskell.ind haddock-style.tex ${PARTS}
 
 haskell.ps : haskell.dvi
        dvips haskell.dvi -o haskell.ps
@@ -135,21 +149,15 @@ publish-pdf: report.pdf
 ht/classes.eps : classes.eps
        $(CP) $< $@
 
-ht/lib-hdrs :
-       $(RM) $@
-       $(LN) ../lib-hdrs ht/lib-hdrs
-
-ht/lib-code :
-       $(RM) $@
-       $(LN) ../lib-code ht/lib-code
-
-html: $(HT_TEXS) ht/classes.eps ht/lib-hdrs ht/lib-code
+.PHONY: html
+html: $(HT_TEXS) ht/classes.eps ht/haddock-style.tex
        cd ht && htlatex haskell.tex "haskell,2"
 
 #########################################
 #      Generic stuff
 #########################################
 
+.PHONY: clean veryclean
 veryclean: clean
        $(RM) *~ 
 
@@ -189,6 +197,9 @@ clean:
 ht/%.tex: %.verb
        $(EXPAND) < $< | $(VERB_TEX4HT) | sh ../tools/subsection >$@
 
+ht/libs/%.tex: libs/%.tex
+       $(CP) $< $@
+
 jfp: h98-book.tex preface-jfp.tex ${PARTS_NO_PREFACE}
        -mkdir $(JFP_DIR)
        for n in h98-book.tex preface-jfp.tex \
@@ -242,3 +253,16 @@ haskell-libraries-2up.dvi : haskell-librariesx.dvi
 haskell-librariesx.dvi : sigplan_haskell-libraries.dvi
        dviselect =4: sigplan_haskell-libraries.dvi haskell-librariesx.dvi
 
+
+# -----------------------------------------------------------------------------
+# Haddock-generated library docs
+
+HADDOCK = /64playpen/simonmar/testing/inplace/bin/haddock
+
+GHC_BUILD = /home/simonmar/builds/testing
+LIB_PKG_DIR = $(GHC_BUILD)/libraries/haskell2010
+
+HADDOCK_GHC_OPTS = --optghc=-package-name --optghc=haskell2010-1.0.0.0 --optghc=-hide-all-packages --optghc=-i --optghc=-i$(GHC_BUILD)/libraries/haskell2010/. --optghc=-i$(GHC_BUILD)/libraries/haskell2010/dist-install/build --optghc=-i$(GHC_BUILD)/libraries/haskell2010/dist-install/build/autogen --optghc=-i$(GHC_BUILD)/Libraries/haskell2010/dist-install/build --optghc=-i$(GHC_BUILD)/Libraries/haskell2010/dist-install/build/autogen --optghc=-i$(GHC_BUILD)/Libraries/haskell2010/. --optghc=-optP-include --optghc=-optP$(GHC_BUILD)/libraries/haskell2010/dist-install/build/autogen/cabal_macros.h --optghc=-package --optghc=array-0.3.0.0 --optghc=-package --optghc=base-4.3.0.0 --optghc=-package-name --optghc=haskell2010 --optghc=-XPackageImports --optghc=-XCPP --optghc=-no-user-package-conf --optghc=-rtsopts --optghc=-O --optghc=-fasm --optghc=-dcore-lint --optghc=-fno-warn-deprecated-flags --optghc=-odir --optghc=libraries/haskell2010/dist-install/build --optghc=-hidir --optghc=$(GHC_BUILD)/libraries/haskell2010/dist-install/build --optghc=-stubdir --optghc=$(GHC_BUILD)/libraries/haskell2010/dist-install/build --optghc=-hisuf --optghc=hi --optghc=-osuf --optghc=o --optghc=-hcsuf --optghc=hc 
+
+haddock :
+       $(HADDOCK) --odir=$(HADDOCK_ODIR) --no-tmp-comp-dir --latex --title="haskell2010-1.0.0.0: Compatibility with Haskell 2010" --read-interface=../ghc-prim,$(GHC_BUILD)/libraries/ghc-prim/dist-install/doc/html/ghc-prim/ghc-prim.haddock --read-interface=../array-0.3.0.0,$(GHC_BUILD)/libraries/array/dist-install/doc/html/array/array.haddock --read-interface=../base-4.3.0.0,$(GHC_BUILD)/libraries/base/dist-install/doc/html/base/base.haddock $(HADDOCK_GHC_OPTS) $(patsubst %, $(LIB_PKG_DIR)/%, $(addsuffix .hs, $(subst .,/,$(LIB_MODULES))))
diff --git a/report/array.verb b/report/array.verb
deleted file mode 100644 (file)
index 985730a..0000000
+++ /dev/null
@@ -1,183 +0,0 @@
-%**<title>The Haskell 98 Library Report: Arrays</title>
-%**~header
-\section{Arrays}
-\label{arrays}
-\index{array}
-
-\outline{
-\inputHS{lib-hdrs/Array}
-}
-
-\Haskell{} provides indexable {\em arrays}, which may be thought of as
-functions whose domains are isomorphic to contiguous subsets of the
-integers.
-Functions restricted in this way can be
-implemented efficiently; in particular, a programmer may
-reasonably expect rapid access to the components.  To ensure
-the possibility of such an implementation, arrays are treated as data, not as
-general functions.
-
-Since most array functions involve the class @Ix@, this module is
-exported from @Array@ so that modules need not import both @Array@ and
-@Ix@. 
-
-\subsection{Array Construction}
-If @a@ is an index type and @b@ is any type, the type of arrays with
-indices in @a@ and elements in @b@ is written @Array a b@.\indextycon{Array}
-An array may be created by the function @array@\indextt{array}.
-The first argument of @array@ is a pair of {\em bounds}, each of the
-index type of the array.  These bounds are the lowest and
-highest indices in the array, in that order.  For example, a
-one-origin vector of length @10@ has bounds @(1,10)@, and a one-origin @10@
-by @10@ matrix has bounds @((1,1),(10,10))@.
-
-The second argument of @array@ is a list of {\em associations}
-of the form ($index$,~$value$).  Typically, this list will
-be expressed as a comprehension.  An association @(i, x)@ defines the
-value of the array at index @i@ to be @x@.  The array is undefined (i.e.~$\bot$) if
-any index in the list is out of bounds.  If any two associations in the
-list have the same index, the value at that index is undefined (i.e.~$\bot$).
-Because the indices must be checked for these errors, @array@ is
-strict in the bounds argument and in the indices of the association list,
-but nonstrict in the values.  Thus, recurrences such as the following are
-possible:
-\bprog
-@
-a = array (1,100) ((1,1) : [(i, i * a!(i-1)) | i <- [2..100]])
-@
-\eprog
-Not every index within the bounds of the array need
-appear in the association list, but the values associated with indices
-that do not appear will be undefined (i.e.~$\bot$).
-Figure~\ref{array-examples} shows some examples that use the
-@array@ constructor.
-
-\begin{figure}[tb]
-\begin{outlineenv}\small
-@
--- Scaling an array of numbers by a given number:
-scale :: (Num a, Ix b) => a -> Array b a -> Array b a
-scale x a = array b [(i, a!i * x) | i <- range b]
-           where b = bounds a
-
--- Inverting an array that holds a permutation of its indices
-invPerm :: (Ix a) => Array a a -> Array a a
-invPerm a = array b [(a!i, i) | i <- range b]
-           where b = bounds a
-
--- The inner product of two vectors
-inner :: (Ix a, Num b) => Array a b -> Array a b -> b
-inner v w = if b == bounds w
-               then sum [v!i * w!i | i <- range b]
-               else error "inconformable arrays for inner product"
-           where b = bounds v
-@
-\end{outlineenv}
-\ecaption{Array examples}
-\label{array-examples}
-\end{figure}
-
-The @(!)@\index{""!@@{\tt  {\char'041}}} operator denotes array subscripting.
-% array subscripting -- if the index lies outside the bounds of the
-% array, the result is undefined.  
-The @bounds@\indextt{bounds} function
-applied to an array returns its bounds.
-The functions @indices@\indextt{indices}, @elems@\indextt{elems}, and
-@assocs@,\indextt{assocs} when applied to an array, return lists of
-the indices, elements, or associations, respectively, in index order.
-An array may be constructed from a pair of bounds and a list
-of values in index order using the function @listArray@\indextt{listArray}.
-
-If, in any dimension, the lower bound is greater than the upper bound,
-then the array is legal, but empty.  Indexing an empty array always
-gives an array-bounds error, but @bounds@ still yields the bounds
-with which the array was constructed.
-
-\subsubsection{Accumulated Arrays}
-\index{array!accumulated}
-
-Another array creation function, @accumArray@,\indextt{accumArray}
-relaxes the restriction that a given index may appear at most once in
-the association list, using an {\em accumulating function} which
-combines the values of associations with the same index.
-% \cite{nikhil:id-nouveau,wadler:array-primitive}:
-The first argument of @accumArray@ is the accumulating function; the
-second is an initial value; the remaining two arguments are a bounds
-pair and an association list, as for the @array@ function.
-For example, given a list of values of some index type, @hist@
-produces a histogram of the number of occurrences of each index within
-a specified range:
-\bprog
-@
-hist :: (Ix a, Num b) => (a,a) -> [a] -> Array a b
-hist bnds is = accumArray (+) 0 bnds [(i, 1) | i<-is, inRange bnds i]
-@
-\eprog
-If the accumulating function is strict, then @accumArray@ is
-strict in the values, as well as the indices, in the
-association list.  Thus, unlike ordinary arrays,
-accumulated arrays should not in general be recursive.
-
-\subsection{Incremental Array Updates}
-\label{array-update}
-
-The operator @(//)@\indextt{//} takes an array and a list of pairs and returns
-an array identical to the left argument except that it has
-been updated by the associations in the right argument.  (As with
-the @array@ function, the indices in the association list must
-be unique for the updated elements to be defined.)  For example,
-if @m@ is a 1-origin, @n@ by @n@ matrix, then
-@m//[((i,i), 0) | i <- [1..n]]@ is the same matrix, except with
-the diagonal zeroed.
-
-@accum@\indextt{accum} "f" takes an array
-and an association list and accumulates pairs from the list into
-the array with the accumulating function "f".  Thus @accumArray@
-can be defined using @accum@:\nopagebreak[4]
-\bprog
-@
-accumArray f z b = accum f (array b [(i, z) | i <- range b])
-@
-\eprogNoSkip
-
-\subsection{Derived Arrays}
-\index{array!derived}
-
-The two functions @fmap@\indextt{fmap} and @ixmap@\indextt{ixmap}
-derive new arrays from existing ones; they may be
-thought of as providing function composition on the left and right,
-respectively, with the mapping that the original array embodies.
-The @fmap@ function transforms the array values while 
-@ixmap@ allows for transformations on array indices.
-Figure~\ref{derived-array-examples} shows some examples.
-
-\begin{figure}[tb]
-\begin{outlineenv}\small
-@
--- A rectangular subarray
-subArray :: (Ix a) => (a,a) -> Array a b -> Array a b
-subArray bnds = ixmap bnds (\i->i)
-
--- A row of a matrix
-row :: (Ix a, Ix b) => a -> Array (a,b) c -> Array b c
-row i x = ixmap (l',u') (\j->(i,j)) x where ((_,l'),(_,u')) = bounds x
-
--- Diagonal of a matrix (assumed to be square)
-diag :: (Ix a) => Array (a,a) b -> Array a b
-diag x = ixmap (l,u) (\i->(i,i)) x
-       where 
-         ((l,_),(u,_)) = bounds x
-
--- Projection of first components of an array of pairs
-firstArray :: (Ix a) => Array a (b,c) -> Array a b
-firstArray = fmap (\(x,y)->x)
-@
-\end{outlineenv}
-\ecaption{Derived array examples}
-\label{derived-array-examples}
-\end{figure}
-
-\subsection{Library {\tt Array}}
-\label {Libarray}
-\inputHS{lib-code/Array}
-%**~footer
diff --git a/report/char.verb b/report/char.verb
deleted file mode 100644 (file)
index c9ec32b..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-%**<title>The Haskell 98 Library Report: Character Utilities</title>
-%**~header
-\section{Character Utilities}
-
-\outline{
-\inputHS{lib-hdrs/Char}
-}
-\indextt{isAscii}
-\indextt{isLatin1}
-\indextt{isControl}
-\indextt{isPrint}
-\indextt{isSpace}
-\indextt{isUpper}
-\indextt{isLower}
-\indextt{isAlpha}
-\indextt{isDigit}
-\indextt{isOctDigit}
-\indextt{isHexDigit}
-\indextt{isAlphaNum}
-\indextt{toUpper}
-\indextt{toLower}
-
-This library provides a limited set of operations on the Unicode
-character set.  
-The first 128 entries of this character set are identical to the
-ASCII set; with the next 128 entries comes the remainder of the
-Latin-1 character set.
-This module offers only a limited view of the
-full Unicode character set; the full set of Unicode character
-attributes is not accessible in this library.
-
-Unicode characters may be divided into five general categories:
-non-printing, lower case alphabetic, other alphabetic, numeric digits, and
-other printable characters.  For the purposes of Haskell, any
-alphabetic character which is not lower case is treated as upper case
-(Unicode actually has three cases: upper, lower, and title).  Numeric
-digits may be part of identifiers but digits outside the ASCII range are not
-used by the reader to represent numbers.  
-
-For each sort of Unicode character, here are the predicates which
-return @True@:
-\begin{center}
-\begin{tabular}{|l|llll|}
-\hline
-Character Type & Predicates  & & & \\
-\hline
-Lower Case Alphabetic & @isPrint@ & @isAlphaNum@ & @isAlpha@ & @isLower@ \\
-Other Alphabetic & @isPrint@ & @isAlphaNum@ & @isAlpha@ & @isUpper@ \\
-Digits & @isPrint@ & @isAlphaNum@ & & \\
-Other Printable & @isPrint@ & & & \\
-Non-printing & & & &\\
-\hline
-\end{tabular}
-\end{center}
-
-The @isDigit@, @isOctDigit@, and @isHexDigit@ functions select only
-ASCII characters.  @intToDigit@ and @digitToInt@ convert between 
-a single digit @Char@ and the corresponding @Int@.  
-@digitToInt@ operates fails unless its argument satisfies @isHexDigit@,
-but recognises both upper and lower-case hexadecimal digits (i.e. @'0'@..@'9'@,
-@'a'@..@'f'@, @'A'@..@'F'@).  @intToDigit@ fails unless its argument is in the range
-@0@..@15@, and generates lower-case hexadecimal digits.
-
-The @isSpace@ function recognizes only white characters in the Latin-1
-range.
-
-The function @showLitChar@ converts a character to a string using
-only printable characters, using Haskell source-language escape conventions.
-The function @lexLitChar@ does the reverse, returning the sequence of characters 
-that encode the character.
-The function @readLitChar@ does the same, but in addition converts the 
-to the character that it encodes.  For example:
-\bprog
-@
-  showLitChar '\n' s       =  "\\n" ++ s
-  lexLitChar  "\\nHello"   =  [("\\n", "Hello")]
-  readLitChar "\\nHello"   =  [('\n', "Hello")]
-@
-\eprog
-
-Function @toUpper@ converts a letter to the corresponding
-upper-case letter, leaving any other character unchanged.  Any
-Unicode letter which has an upper-case equivalent is transformed.
-Similarly, @toLower@ converts a letter to the
-corresponding lower-case letter, leaving any other character
-unchanged.
-
-The @ord@ and @chr@ functions are @fromEnum@ and @toEnum@
-restricted to the type @Char@.
-
-\clearpage
-\subsection{Library {\tt Char}}
-\label{Char}
-\inputHS{lib-code/Char}
-
-%**~footer
-
-
diff --git a/report/complex.verb b/report/complex.verb
deleted file mode 100644 (file)
index 1ffe6aa..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-%**<title>The Haskell 98 Library Report: Complex Numbers</title>
-%**~header
-\section{Complex Numbers}
-\label{lib-num}
-
-\outline{
-\inputHS{lib-hdrs/Complex}
-}
-
-Complex numbers are an algebraic type.
-The constructor @(:+)@\indextt{:+} forms a complex number from its
-real and imaginary rectangular components.  This constructor is
-strict: if either the real part or the imaginary part of the number is
-$\bot$, the entire number is $\bot$.  A complex number may also
-be formed from polar components of magnitude and phase by the function
-@mkPolar@\indextt{mkPolar}.  The function @cis@\indextt{polar}
-produces a complex number from an angle "t".
-Put another way, @cis@ "t" is a complex value with magnitude "1"
-and phase "t" (modulo "2\pi").
-
-The function @polar@\indextt{polar} takes a complex number and
-returns a (magnitude, phase) pair in canonical form: The magnitude is
-nonnegative, and the phase, in the range $(- \pi , \pi ]$; if the
-magnitude is zero, then so is the phase.  
-
-The functions @realPart@\indextt{realPart} and
-@imagPart@\indextt{imagPart} extract the rectangular components of a
-complex number and the functions @magnitude@\indextt{magnitude} and
-@phase@\indextt{phase} extract the polar components of a complex
-number.  The function @conjugate@\indextt{conjugate} computes the
-conjugate of a complex number in the usual way.
-
-The magnitude and sign of a complex number are defined as follows:
-\bprog
-@
-abs z            =  magnitude z :+ 0
-signum 0         =  0
-signum z@@(x:+y)   =  x/r :+ y/r  where r = magnitude z
-@
-\eprog
-That is, @abs@ $z$ is a number with the magnitude of $z$, but oriented
-in the positive real direction, whereas @signum@ $z$ has the phase of
-$z$, but unit magnitude.
-
-\subsection{Library {\tt Complex}}
-\inputHS{lib-code/Complex}
-
-%**~footer
-
diff --git a/report/cputime.verb b/report/cputime.verb
deleted file mode 100644 (file)
index c45ef4b..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-%**<title>The Haskell 98 Library Report: CPU Time</title>
-%**~header
-\section{CPU Time}
-\label{cputime}
-\index{CPU time}
-\index{execution time}
-
-\outline {
-\inputHS{lib-hdrs/CPUTime}
-}
-
-Computation @getCPUTime@ returns the number of picoseconds of CPU time
-used by the current program.  The precision of this result is given by
-@cpuTimePrecision@.  This is the smallest measurable difference in CPU
-time that the implementation can record, and is given as an integral
-number of picoseconds.
-
-%**~footer
-
diff --git a/report/directory.verb b/report/directory.verb
deleted file mode 100644 (file)
index f4acda3..0000000
+++ /dev/null
@@ -1,165 +0,0 @@
-%**<title>The Haskell 98 Library Report: Directory functions</title>
-%**~header
-
-%% Other useful functions from SML 96 include modification time
-%% and path-testing (is this a full path/real path).
-
-\section{Directory Functions}
-\index{directories}
-\index{the file system}
-
-\outline{
-\inputHS{lib-hdrs/Directory}
-}
-\indextt{createDirectory}\indextt{removeDirectory}\indextt{removeFile}
-\indextt{renameDirectory}\indextt{renameFile}
-\indextt{getDirectoryContents}\indextt{getCurrentDirectory}
-\indextt{setCurrentDirectory}
-
-These functions operate on directories in the file system.  
-
-Any @Directory@ operation could raise an @isIllegalOperation@, as
-described in Section~\ref{IOError}; all other permissible errors are
-described below.  Note that, in particular, if an implementation does
-not support an operation it should raise an @isIllegalOperation@.
-A directory contains a series of entries, each of which is a named
-reference to a file system object (file, directory etc.).  Some
-entries may be hidden, inaccessible, or have some administrative
-function (for instance, ``.'' or ``..'' under POSIX), but all such
-entries are considered to form part of the directory contents.
-Entries in sub-directories are not, however, considered to form part
-of the directory contents.  Although there may be
-file system objects other than files and directories, this library
-does not distinguish between physical files and other non-directory
-objects.  All such objects should therefore be treated as if they are files.
-
-Each file system object is referenced by a {\it path}\index{path}.  There is
-normally at least one absolute path to each file system object.  In
-some operating systems, it may also be possible to have paths which
-are relative to the current directory.
-
-Computation @createDirectory@~"dir" creates a new directory "dir" which is
-initially empty, or as near to empty as the operating system allows.
-\index{making directories}
-
-{\em Error~reporting}.
-The @createDirectory@ computation may fail with:
-@isPermissionError@ if the user is not permitted to create the directory;
-@isAlreadyExistsError@ if the directory already exists; or @isDoesNotExistError@ if
-the new directory's parent does not exist.
-
-Computation @removeDirectory@~"dir" removes an existing directory
-"dir"\index{deleting directories}\index{removing directories}.  The
-implementation may specify additional constraints which must be
-satisfied before a directory can be removed (for instance, the directory has to
-be empty, or may not be in use by other processes).  It is not legal
-for an implementation to partially remove a directory unless the
-entire directory is removed. A conformant implementation need not
-support directory removal in all situations (for instance, removal of the root
-directory).
-
-Computation @removeFile@~"file" removes the directory entry for an existing
-file "file", where "file" is not itself a directory\index{deleting
-files}\index{removing files}. The implementation may specify additional
-constraints which must be satisfied before a file can be removed (for instance, the
-file may not be in use by other processes).
-
-{\em Error~reporting}.
-The @removeDirectory@ and @removeFile@ computations may fail with:
-@isPermissionError@ if the user is not permitted to remove the file/directory;
-or @isDoesNotExistError@ if the file/directory does not exist.
-
-Computation @renameDirectory@~"old"~"new" changes the name of an existing
-directory from "old" to "new"\index{renaming directories}\index{moving
-directories}.  If the "new" directory already exists, it is atomically
-replaced by the "old" directory.  If the "new" directory is neither
-the "old" directory nor an alias of the "old" directory, it is removed
-as if by @removeDirectory@.  A conformant implementation need not
-support renaming directories in all situations (for instance, renaming to an
-existing directory, or across different physical devices), but the
-constraints must be documented.
-
-Computation @renameFile@~"old"~"new" changes the name of an existing file
-system object from "old" to "new"\index{renaming files}\index{moving files}.
-If the "new" object already exists, it is atomically replaced by the "old"
-object.  Neither path may refer to an existing directory.  A conformant
-implementation need not support renaming files in all situations
-(for instance, renaming across different physical devices), but the constraints must be
-documented.
-
-{\em Error~reporting}.
-The @renameDirectory@ and @renameFile@ computations may fail with:
-@isPermissionError@ if the user is not permitted to rename the file/directory,
-or if either argument to @renameFile@ is a directory;
-or @isDoesNotExistError@ if the file/directory does not exist.
-
-Computation @getDirectoryContents@~"dir" returns a list of {\em all} entries
-in "dir"\index{reading a directory}.
-Each entry in the returned list is named relative to the directory "dir", not as an absolute path.
-
-If the operating system has a notion of current directories,
-@getCurrentDirectory@ returns an absolute path to the
-current directory of the calling process\index{current directory}.
-
-{\em Error~reporting}.
-The @getDirectoryContents@ and @getCurrentDirectory@ computations may fail with:
-@isPermissionError@ if the user is not permitted to access the directory;
-or @isDoesNotExistError@ if the directory does not exist.
-
-If the operating system has a notion of current directories,
-@setCurrentDirectory@~"dir" changes the current directory of the
-calling process to "dir"\index{changing the directory}\index{setting the directory}.
-
-{\em Error~reporting}.
-@setCurrentDirectory@ may fail with:
-@isPermissionError@ if the user is not permitted to change directory
-to that specified;
-or @isDoesNotExistError@ if the directory does not exist.
-
-The @Permissions@ type is used to record whether certain operations are
-permissible on a file/directory.  @getPermissions@ and
-@setPermissions@ get and set these permissions, respectively.  
-Permissions apply both to files and directories.  For
-directories, the @executable@ field will be @False@, and for files the
-@searchable@ field will be @False@.  Note that directories may be
-searchable without being readable, if permission has been given to use
-them as part of a path, but not to examine the directory contents.
-
-Note that to change
-some, but not all permissions, a construct on the following lines must
-be used.  
-\bprog
-@
-makeReadable f = do
-                   p <- getPermissions f
-                   setPermissions f (p {readable = True})
-@
-\eprog
-The operation @doesDirectoryExist@ returns @True@ if the argument file
-exists and is a directory, and @False@ otherwise. The operation @doesFileExist@ returns @True@
-if the argument file exists and is not a directory, and @False@ otherwise.
-
-The @getModificationTime@ operation returns the
-clock time at which the file/directory was last modified.
-
-{\em Error~reporting}.
-@get(set)Permissions@,
-@doesFile(Directory)Exist@,
-and @getModificationTime@
-may fail with:
-@isPermissionError@ if the user is not permitted to access
-the appropriate information;
-or @isDoesNotExistError@ if the file/directory does not exist.
-The @setPermissions@
-computation may also fail with:
-@isPermissionError@ if the user is not permitted to change
-the permission for the specified file or directory;
-or @isDoesNotExistError@ if the file/directory does not exist.
-% Duplicates the first case above, and would require
-% extensive consistency checking throughout. KH
-% The @doesFileExist@ and @doesDirectoryExist@ computations
-% may also fail with @isPermissionError@ if some part of the path
-% to the file/directory cannot be searched.
-
-%**~footer
-
diff --git a/report/haddock-style.verb b/report/haddock-style.verb
new file mode 100644 (file)
index 0000000..4ab4b27
--- /dev/null
@@ -0,0 +1,39 @@
+% Haddock style sheet
+
+\newcommand{\haddockbeginheader}{\hrulefill}
+\newcommand{\haddockendheader}{\hrulefill}
+
+% a little gap before the ``Methods'' header
+\newcommand{\haddockpremethods}{\vspace{2ex}}
+
+% inserted before \\begin{verbatim}
+\newcommand{\haddockverb}{\small}
+
+% an identifier: we add an index entry
+\newcommand{\haddockid}[1]{\haddocktt{#1}\indextt{#1}}
+
+% \newcommand{\haddockbeginconstrs}{\vspace{-2ex}\begin{tabular}{llp{4in}}}
+\newcommand{\haddockbeginconstrs}{\begin{tabular}{@@{}llp{4in}}}
+\newcommand{\haddockendconstrs}{\end{tabular}}
+
+\newcommand{\haddockbeginargs}{\begin{tabular}{@@{}llp{4in}}}
+\newcommand{\haddockendargs}{\end{tabular}}
+
+\newcommand{\haddocktt}[1]{{\small \texttt{#1}}}
+\newcommand{\haddockdecltt}[1]{{\small\bfseries \texttt{#1}}}
+
+\makeatletter
+\newenvironment{haddockdesc}
+               {\list{}{\labelwidth\z@@ \itemindent-\leftmargin
+                        \let\makelabel\haddocklabel}}
+               {\endlist}
+\newcommand*\haddocklabel[1]{\hspace\labelsep\haddockdecltt{#1}}
+\makeatother
+
+% after a declaration, start a new line for the documentation.
+% Otherwise, the documentation starts right after the declaration,
+% because we're using the list environment and the declaration is the
+% ``label''.  I tried making this newline part of the label, but
+% couldn't get that to work reliably (the space seemed to stretch
+% sometimes).
+\newcommand{\haddockbegindoc}{\hfill\\[1ex]}
diff --git a/report/haskell-prime-draft.html b/report/haskell-prime-draft.html
deleted file mode 100644 (file)
index aa9f2ff..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-<html>
-<head>
-</head>
-<HEAD>
-<TITLE>The Haskell Prime Report: Working Draft</title></head>
-</head>
-</head>
-</head>
-</head>
-</HEAD>
-<BODY>
-<div align=center>
-<img src="hprime.png" alt="Haskell Prime">
-</div>
-
-<h1>The Haskell Prime Report: <em>Working Draft</em></h1>
-
-The Haskell Prime Report is a work in progress.  This page collects
-the current draft, as stored in the darcs repository.  All the files
-below are generated automatically from the draft sources.
-
-<em>Do not rely on the text of this Report.</em>  This is only a current
-snapshot, and does not reflect the final version.
-
-<ul>
-<p><li> The Haskell Prime Report (working draft) 
-  <ul>
-  <li> <a href="haskell-report-html/index.html">HTML</a>
-  <li> <a href="haskell.ps.gz">Gzipped Postscript</a>
-  <li> <a href="haskell.pdf">PDF</a>
-  <!-- li> <a href="haskell98-revised-bugs.html">A complete list of all bugs</a> (found so far) -->
-  </ul>
-
-<p>
-<li> <a href="haskell-report-html.tar.gz">Gzipped tar bundle of the HTML sources</a> for local browsing.
-
-<p>
-<li> The sources for the Report are in a 
-<a href="http://darcs.haskell.org/haskell-prime-report">
-publicly visible darcs repository</a>.
-</ul>
-
-
-<hr>
-<address>haskell-prime@haskell.org</address>
-</body>
-</html>
-
index 8f2c0d9..d9b31c9 100644 (file)
 \newcommand{\eprogB}{}
 \newcommand{\eprogNoSkip}{\eprog}
 
-% setting of code from ffi.tex
-%
-\makeatletter
-\newenvironment{codedesc}{%             % description of code pieces
-  \list{}{\labelwidth\z@@
-    \let\makelabel\codedesclabel}
-  }{%
-  \endlist
-  }
-\newcommand*{\codedesclabel}[1]{%
-  \hspace{-\leftmargin}
-  \parbox[b]{\labelwidth}{\makebox[0pt][l]{\texttt{#1}}\\}\hfil\relax
-  }
-\makeatother
-\newcommand{\combineitems}{\vspace*{-\itemsep}\vspace*{-\parsep}\vspace*{-1em}}
-
 % general from ffi.tex
 %
 \newcommand{\clearemptydoublepage}{%
 \hyphenation{da-ta-type da-ta-types}
 \hyphenation{Has-kell}
 
+% Macros for Haddock output
+\input{haddock-style}
 
 \begin{document}
 
@@ -458,41 +444,35 @@ that it does not claim to be a definition of the language Haskell 2010.
 \part{The Haskell 2010 Libraries}
 \label{libraries}
 
-\input{ratio}\startnewsection
-\input{complex}\startnewsection
-\input{numeric}\startnewsection
-\input{ix}\startnewsection
-\input{array}\startnewsection
-\input{list}\startnewsection
-\input{maybe}\startnewsection
-\input{char}\startnewsection
-\input{monad}\startnewsection
-\input{io}\startnewsection
-\input{directory}\startnewsection
-\input{system}\startnewsection
-\input{time}\startnewsection
-\input{locale}\startnewsection
-\input{cputime}\startnewsection
-\input{random}\startnewsection
-
-\input{lib-data-intword}
-\input{lib-data-bits}
-
-\input{lib-foreign}
-\input{lib-ptr}
-\input{lib-foreignptr}
-\input{lib-storable}
-\input{lib-stableptr}
-\input{lib-marshal}
-\input{lib-marshalerror}
-\input{lib-marshalutils}
-\input{lib-marshalalloc}
-\input{lib-marshalarray}
-\input{lib-cforeign}
-\input{lib-ctypes}
-\input{lib-cstring}
-\input{lib-cerror}
-
+\input{libs/Control-Monad}
+\input{libs/Data-Array}
+\input{libs/Data-Bits}
+\input{libs/Data-Char}
+\input{libs/Data-Complex}
+\input{libs/Data-Int}
+\input{libs/Data-Ix}
+\input{libs/Data-List}
+\input{libs/Data-Maybe}
+\input{libs/Data-Ratio}
+\input{libs/Data-Word}
+\input{libs/System-Environment}
+\input{libs/System-Exit}
+\input{libs/Foreign}
+\input{libs/Foreign-C}
+\input{libs/Foreign-C-Error}
+\input{libs/Foreign-C-String}
+\input{libs/Foreign-C-Types}
+\input{libs/Foreign-ForeignPtr}
+\input{libs/Foreign-Marshal}
+\input{libs/Foreign-Marshal-Alloc}
+\input{libs/Foreign-Marshal-Array}
+\input{libs/Foreign-Marshal-Error} 
+\input{libs/Foreign-Marshal-Utils}
+\input{libs/Foreign-Ptr}
+\input{libs/Foreign-StablePtr}
+\input{libs/Foreign-Storable}
+\input{libs/System-IO}
+\input{libs/System-IO-Error}
 
 % ------------------------- Index and references -----------------------------------
 
diff --git a/report/ht/haddock-style.tex b/report/ht/haddock-style.tex
new file mode 100644 (file)
index 0000000..71b48b3
--- /dev/null
@@ -0,0 +1,39 @@
+% Haddock style sheet
+
+\newcommand{\haddockbeginheader}{\begin{quote}}
+\newcommand{\haddockendheader}{\end{quote}}
+
+% a little gap before the ``Methods'' header
+\newcommand{\haddockpremethods}{\vspace{2ex}}
+
+% inserted before \\begin{verbatim}
+\newcommand{\haddockverb}{}
+
+% an identifier: we add an index entry
+\newcommand{\haddockid}[1]{\haddocktt{#1}\indextt{#1}}
+
+% \newcommand{\haddockbeginconstrs}{\vspace{-2ex}\begin{tabular}{llp{4in}}}
+\newcommand{\haddockbeginconstrs}{\begin{tabular}{@{}llp{4in}}}
+\newcommand{\haddockendconstrs}{\end{tabular}}
+
+\newcommand{\haddockbeginargs}{\begin{tabular}{@{}llp{4in}}}
+\newcommand{\haddockendargs}{\end{tabular}}
+
+\newcommand{\haddocktt}[1]{{\texttt{#1}}}
+\newcommand{\haddockdecltt}[1]{{\bfseries \texttt{#1}}}
+
+\makeatletter
+\newenvironment{haddockdesc}
+               {\list{}{\labelwidth\z@ \itemindent-\leftmargin
+                        \let\makelabel\haddocklabel}}
+               {\endlist}
+\newcommand*\haddocklabel[1]{\hspace\labelsep\haddockdecltt{#1}}
+\makeatother
+
+% after a declaration, start a new line for the documentation.
+% Otherwise, the documentation starts right after the declaration,
+% because we're using the list environment and the declaration is the
+% ``label''.  I tried making this newline part of the label, but
+% couldn't get that to work reliably (the space seemed to stretch
+% sometimes).
+\newcommand{\haddockbegindoc}{}
index 529b192..093c2d4 100644 (file)
 
 % Formatting details of signatures descriptions
 %
-\ConfigureList{codedesc}{%
+\ConfigureList{haddockdesc}{%
   \HCode{<dl>}
 }{%
   \HCode{</dl>}
 }{%
-  \HCode{<dt class="codedesc">}
+  \HCode{<dt class="haddockdesc">}
 }{%
-  \HCode{<dd class="codedesc">}
+  \HCode{<dd class="haddockdesc">}
 }
 
 %\ConfigureEnv{grammar}{\HCode{<div class="quote">}}{\HCode{</div>}}{}{}
   %
   % Environment for library signature descriptions.
   % - Signatures in dark red
-  dt.codedesc {
+  dt.haddockdesc {
     color: darkred;
   }
   % - Avoid too much space between items.
 dd.codedesc {
-    padding-bottom: .2em;
 }
dd.haddockdesc {
+   padding-bottom: .2em;
+ }
   % - Verbatim displays in item descriptions should not have too wide margins.
-  dd.codedesc table {
-    margin-bottom: -.8em;
-  }
+%  dd.haddockdesc table {
+%    margin-bottom: -.8em;
+%  }
   % - Paragraph start margin should be smaller in items.
   % - Shrink paragraph end margins to avoid gap to next item.
-  dd.codedesc p {
-    margin-top: .5em;
-    margin-bottom: 0;
-  }
+%  dd.haddockdesc p {
+%    margin-top: .5em;
+%    margin-bottom: 0;
+%  }
   % Otherwise, the font size get's reduced twice.
   sub { 
     font-size: 100\%; 
diff --git a/report/html.config b/report/html.config
deleted file mode 100644 (file)
index 77489a1..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-aux=haskell.aux
-htmldir=haskell-report-html/
-refs=reportrefs
-files= preface.verb
-files= intro.verb
-files= lexemes.verb
-files= exps.verb
-files= decls.verb
-files= modules.verb
-files= basic.verb
-files= io-13.verb
-files=standard-prelude.verb
-files=syntax-iso.verb
-files=fixity.verb
-files=derived.verb
-files=pragmas.verb
-
-files=ratio.verb
-files=complex.verb
-files=numeric.verb
-files=ix.verb
-files=array.verb
-files=list.verb
-files=maybe.verb
-files=char.verb
-files=monad.verb
-files=io.verb
-files=directory.verb
-files=system.verb
-files=time.verb
-files=locale.verb
-files=cputime.verb
-files=random.verb
-
-files=haskell.bbl
-
-index=haskell-report-html/indexprime.html
-style=article
-
-~top=<a href="index.html">top</a>
-~style=<body bgcolor="#ffffff">
-~id=<i>The Haskell 2010 Report</i><br>
-~back=<a href="~prev.html">back</a>
-~nxt=<a href="~next.html">next</a>
-~funct=<a href="prelude-index.html">function index</a>
-~contents=<a href="indexprime.html">contents</a>
-~foot=<!-- empty -->
-~footer=<hr>~id~top | ~back | ~nxt | ~contents | ~funct ~foot
-~sfooter=<hr>~id~top | back | ~nxt | ~contents | ~funct ~foot
-~efooter=<hr>~id~top | ~back | next | ~contents | ~funct ~foot
-~header=~style ~id ~top | ~back | ~nxt | ~contents | ~funct <br><hr>
-~sheader=~style ~id ~top | back | ~nxt | ~contents | ~funct <br><hr>
-~eheader=~style ~id ~top | ~back | next | ~contents | ~funct <br><hr>
-~indexHeader=<title>Haskell 2010 Contents</title>~style ~id~top | ~funct <br><h3>Haskell 2010 Report: Contents</h3>
diff --git a/report/io.verb b/report/io.verb
deleted file mode 100644 (file)
index 5365bcd..0000000
+++ /dev/null
@@ -1,637 +0,0 @@
-%**<title>The Haskell 98 Library Report: Input/Output</title>
-%**~header
-\section{Input/Output}
-\label{IO}
-\index{input/output}
-\index{I/O}
-\indextt{IO}
-
-% Gotta break the figure ...
-\outline{
-\inputHS{lib-hdrs/IO}
-}
-\outline{
-\inputHS{lib-hdrs/IO1}
-}
-
-The monadic I/O system used in \Haskell{} is described by the
-\Haskell{} language report.  Commonly used I/O functions such as
-@print@ are part of the standard prelude and need not be explicitly
-imported.  This library contain more advanced I/O features.
-Some related operations on file systems are contained in the
-@Directory@ library.
-
-\subsection{I/O Errors}
-\index{I/O errors}
-\label{IOError}
-Errors of type @IOError@ are used by the I/O monad.  This is an
-abstract type; the library provides functions to interrogate and
-construct values in @IOError@:\indextycon{IOError}
-\begin{itemize}
-\item
-@isAlreadyExistsError@\indextt{isAlreadyExistsError}
- -- the operation failed because one of its
-arguments already exists.
-\item
-@isDoesNotExistError@\indextt{isDoesNotExistError}
- -- the operation failed because one of its
-arguments does not exist.
-\item
-@isAlreadyInUseError@\indextt{isAlreadyInUseError}
- -- the operation failed because one of its
-arguments is a single-use resource, which is already being used (for
-example, opening the same file twice for writing might give this
-error).
-\item
-@isFullError@\indextt{isFullError}
- -- the operation failed because the device is full.
-\item
-@isEOFError@\indextt{isEOFError}
- -- the operation failed because the end of file
-has been reached.
-\item
-@isIllegalOperation@\indextt{isIllegalOperation}
- -- the operation is not possible.
-\item
-@isPermissionError@\indextt{isPermissionError}
- -- the operation failed because the user does not
-have sufficient operating system privilege to perform that operation.
-\item
-@isUserError@\indextt{isUserError}
- -- a programmer-defined error value has been raised using
-@fail@.\indextt{fail}
-\end{itemize}
-All these functions return a @Bool@, which is @True@ if
-its argument is the corresponding kind of error, and @False@
-otherwise.  
-
-Any computation which returns an @IO@ result may fail with
-@isIllegalOperation@.  Additional errors which could be raised by
-an implementation are listed after the corresponding operation.  In
-some cases, an implementation will not be able to distinguish between
-the possible error causes.  In this case it should return
-@isIllegalOperation@.
-
-Three additional functions are provided to obtain information about an
-error value.  These are @ioeGetHandle@\indextt{ioeGetHandle} which
-returns @Just@~"hdl" if the error value refers to handle "hdl" and
-@Nothing@ otherwise; @ioeGetFileName@\indextt{ioeGetFileName} which
-returns @Just@~"name" if the error value refers to file "name", and
-@Nothing@ otherwise; and @ioeGetErrorString@\indextt{ioeGetErrorString} which returns a
-string.  For ``user'' errors (those which are raised using @fail@),
-the string returned by @ioeGetErrorString@ is the argument that was passed to
-@fail@; for all other errors, the string is implementation-dependent.
-
-The @try@ function returns an error in a computation explicitly using
-the @Either@ type.
-
-The @bracket@ function 
-captures a common allocate, compute, deallocate idiom in which the
-deallocation step must occur even in the case of an error during
-computation.  This is similar to try-catch-finally in Java.
-% Inline the code here since there's no other functions in IO that
-% are not primitive.
-
-
-
-\subsection{Files and Handles}
-\Haskell{} interfaces to the external world through an abstract {\em file
-system}\index{file system}.  This file system is a collection of named {\em file
-system objects}, which may be organised
-in {\em directories}\index{directories} (see @Directory@).  
-In some implementations, directories may themselves be file system
-objects and could be entries in other directories.  For simplicity,
-any non-directory file system object is termed a {\em file}\index{file},
-although it could in fact be a communication channel, or any other
-object recognised by the operating system.  {\em Physical
-files}\index{physical file} are 
-persistent, ordered files, and normally reside on disk.
-
-File and directory names are values of type @String@, whose precise
-meaning is operating system dependent.  Files can be opened, yielding
-a handle which can then be used to operate on the contents of that
-file.
-
-\label{Handles}
-\index{handles}
-
-\Haskell{} defines operations to read and write characters from and to files,
-represented by values of type @Handle@.  Each value of this type is a {\em
-handle}: a record used by the \Haskell{} run-time system to {\em manage} I/O
-with file system objects.  A handle has at least the following properties:
-
-\begin{itemize}
-\item
- whether it manages input or output or both;
-\item
- whether it is {\em open}, {\em closed} or {\em semi-closed};
-\item
- whether the object is seekable;
-\item
- whether buffering is disabled, or enabled on a line or block basis;
-\item
- a buffer (whose length may be zero).
-\end{itemize}
-
-Most handles will also have a current I/O position indicating where the next
-input or output operation will occur.  A handle is {\em readable} if it
-manages only input or both input and output; likewise, it is {\em writable} if
-it manages only output or both input and output.  A handle is {\em open} when
-first allocated.  Once it is closed it can no longer be used for either input
-or output, though an implementation cannot re-use its storage while references
-remain to it.  Handles are in the @Show@ and @Eq@ classes.  The string
-produced by showing a handle is system dependent; it should include 
-enough information to identify the handle for debugging.  A handle is
-equal according to @==@ only to itself; no attempt
-is made to compare the internal state of different handles for equality.
-
-\subsubsection{Standard Handles}
-\label{StandardHandles}
-\index{standard handles}
-
-Three handles are allocated during program initialisation.  The first
-two (@stdin@\indextt{stdin} and @stdout@\indextt{stdout}) manage input or output from the \Haskell{}
-program's standard input or output channel respectively.  The third
-(@stderr@\indextt{stderr}) manages output to the standard error channel.  These
-handles are initially open.
-
-\subsubsection{Semi-Closed Handles}
-\label{SemiClosed}
-\index{semi-closed handles}
-
-The operation "@hGetContents@ hdl"\indextt{hGetContents} (Section~\ref{hGetContents})
-puts a handle "hdl" into an intermediate
-state, {\em semi-closed}.  In this state, "hdl" is effectively closed,
-but items are read from "hdl" on demand and accumulated in a special
-list returned by @hGetContents@~"hdl".
-
-Any operation that fails because a handle is
-closed, also fails if a handle is semi-closed. The only exception is @hClose@.
-A semi-closed handle becomes closed:
-\begin{itemize}
-\item
-if  @hClose@ is applied to it;
-\item
-if an I/O error occurs when reading an item from the handle;
-\item
-or once the entire contents of the handle has been read.
-\end{itemize}
-
-Once a semi-closed handle becomes closed, the contents of the
-associated list becomes fixed.  The contents of this final list is
-only partially specified: it will contain at least all the items of
-the stream that were evaluated prior to the handle becoming closed.
-
-Any I/O errors encountered while a handle is semi-closed are simply
-discarded.
-\subsubsection{File locking}
-
-Implementations should enforce as far as possible, at least locally to the
-\Haskell{} process, multiple-reader single-writer locking on files.
-That is, {\em there may either be many handles on the same file which manage
-input, or just one handle on the file which manages output}.  If any
-open or semi-closed handle is managing a file for output, no new
-handle can be allocated for that file.  If any open or semi-closed
-handle is managing a file for input, new handles can only be allocated
-if they do not manage output.  Whether two files are the same is
-implementation-dependent, but they should normally be the same if they
-have the same absolute path name and neither has been renamed, for
-example.
-
-{\em Warning}: the @readFile@ operation (Section~\ref{standard-io-functions})
-holds a semi-closed handle on the file until the entire contents of the file have been
-consumed.  It follows that an attempt to write to a file (using @writeFile@, for example)
-that was earlier opened by @readFile@ will usually result in 
-failure with @isAlreadyInUseError@.
-\indextt{readFile}
-\indextt{writeFile}
-
-
-\subsection{Opening and Closing Files}
-\label{OpeningClosing}
-
-\subsubsection{Opening Files}
-\label{Opening}
-\index{opening a file}
-\index{creating a file}
-
-Computation @openFile@~"file"~"mode"\indextt{openFile} allocates and
-returns a new, open handle to manage the file "file".
-% I don't believe this footnote is technically correct -- functions
-% are never computations IIRC: the computation is the action
-% that occurs when the function is applied to a state token -- KH
-% \footnote{We use
-% the term "computation" instead of "function" here to separate
-% functions which denote actions in the I/O monad from those outside the monad.}
-It manages
-input if "mode"\indextycon{IOMode} is @ReadMode@\indextt{ReadMode},
-output if "mode" is @WriteMode@\indextt{WriteMode} or
-@AppendMode@,\indextt{AppendMode} and both input and output if mode is
-@ReadWriteMode@.\indextt{ReadWriteMode}
-
-If the file does not exist and it is opened for output, it should be created
-as a new file.  If "mode" is @WriteMode@ and the file already exists, then it
-should be truncated to zero length.  Some operating systems delete empty
-files, so there is no guarantee that the file will exist following an
-@openFile@ with "mode" @WriteMode@ unless it is subsequently written to
-successfully.  The handle is positioned at the end of the file if "mode" is
-@AppendMode@, and otherwise at the beginning (in which case its internal I/O
-position is 0).  The initial buffer mode is implementation-dependent.
-
-If @openFile@ fails on a file opened for output, the file may still
-have been created if it did not already exist.
-
-{\em Error reporting}: the @openFile@ computation may fail with
-@isAlreadyInUseError@ if the file is already open and cannot be
-reopened;
-@isDoesNotExistError@ if the file does not exist; or
-@isPermissionError@ if the user does not have
-permission to open the file.
-\indextt{isAlreadyInUseError}
-\indextt{isDoesNotExistError}
-\indextt{isPermissionError}
-
-\subsubsection{Closing Files}
-\label{Closing}
-\index{closing a file}
-
-Computation @hClose@~"hdl"\indextt{hClose} makes handle "hdl" closed.  Before the
-computation finishes, if "hdl" is writable its buffer is flushed as
-for @hFlush@.
-Performing @hClose@ on a handle that has already been closed has no effect; 
-doing so not an error.  All other operations on a closed handle will fail.
-If @hClose@ fails for any reason, any further operations (apart from @hClose@) on the 
-handle will still fail as if "hdl" had been successfully closed.
-
-\subsection{Determining the Size of a File}
-\label{FileSize}
-\index{size of file}
-
-For a handle "hdl" which is attached to a physical file, @hFileSize@\indextt{hFileSize}
-"hdl" returns the size of that file in 8-bit bytes ("\geq" 0).
-
-\subsection{Detecting the End of Input}
-\label{EOF}
-\index{end of file}
-
-For a readable handle "hdl", computation @hIsEOF@~"hdl"\indextt{hIsEOF} returns @True@
-if no further input can be taken from "hdl"; for a handle attached to a 
-physical file this means that the current I/O position is equal to the length of the file.
-Otherwise, it returns @False@.  The computation @isEOF@\indextt{isEOF} is identical,
-except that it works only on @stdin@.
-
-% The computation may fail with:
-% \begin{itemize}
-% \item
-% @HardwareFault@
-% A physical I/O error has occurred.
-% [@EIO@]
-% \item
-% @ResourceExhausted@
-% Insufficient resources are available to perform the operation.
-% [@ENOMEM@]
-% \item
-% @IllegalOperation@
-% The handle is not open for reading.
-% \end{itemize}
-
-\subsection{Buffering Operations}
-\label{Buffering}
-\index{file buffering}
-
-Three kinds of buffering are supported: line-buffering, 
-block-buffering or no-buffering.  These modes have the following effects.
-For output, items are written out, or {\em flushed}, from the internal buffer 
-according to the buffer mode:
-\begin{itemize}
-\item
-{\bf line-buffering:}
-the entire buffer is flushed whenever a newline is output, the
-buffer overflows, a @hFlush@ is issued, or the handle is closed.
-\item
-{\bf block-buffering:}
-the entire buffer is written out whenever it overflows, a @hFlush@ is
-issued, or the handle is closed.
-\item
-{\bf no-buffering:}
-output is written immediately, and never stored in the buffer.
-\end{itemize}
-An implementation is free to flush the buffer more frequently, but not 
-less frequently, than
-specified above.  The buffer is emptied as soon as it has been written out.
-
-Similarly, input occurs according to the buffer mode for handle "hdl".
-\begin{itemize}
-\item
-{\bf line-buffering:}
-when the buffer for "hdl" is not empty, the next item is obtained from
-the buffer; otherwise, when the buffer is empty, characters are read into
-the buffer until the next newline character is encountered or the buffer is full.  No
-characters are available until the newline character is available or the buffer is full.
-\item
-{\bf block-buffering:} 
-when the buffer for "hdl" becomes empty, the
-next block of data is read into the buffer.
-\item
-{\bf no-buffering:} 
-the next input item is read and returned.  The @hLookAhead@\indextt{hLookAhead} 
-operation (Section~\ref{hLookAhead}) implies that
-even a no-buffered handle may require a one-character buffer.
-\end{itemize}
-
-For most implementations, physical files will normally be block-buffered 
-and terminals will normally be line-buffered.
-
-Computation @hSetBuffering@~"hdl"~"mode"\indextt{hSetBuffering} sets the
-mode of buffering for handle "hdl" on subsequent reads and writes.
-\begin{itemize}
-\item
-If "mode" is @LineBuffering@, line-buffering is
-enabled if possible.
-\item
-If "mode" is @BlockBuffering@~"size", then block-buffering
-is enabled if possible.  The size of the buffer is "n" items
-if "size" is @Just @"n" and is otherwise implementation-dependent.
-\item
-If "mode" is @NoBuffering@, then buffering is disabled if possible.
-\end{itemize}
-
-If the buffer mode is changed from @BlockBuffering@ or
-@LineBuffering@ to @NoBuffering@, then 
-\begin{itemize}
-\item
-if "hdl" is writable, the buffer is flushed as for 
-@hFlush@;
-\item
-if "hdl" is not writable, the contents of the buffer is discarded.
-\end{itemize}
-
-{\em Error reporting}: the @hSetBuffering@ computation may fail with
-@isPermissionError@ if
-the handle has already been used for reading or writing
-and the implementation does not allow the buffering mode to
-be changed.
-
-Computation @hGetBuffering@~"hdl"\indextt{hGetBuffering} returns the current buffering mode
-for "hdl".
-
-The default buffering mode when a handle is opened is
-implementation-dependent and may depend on the file system object which is
-attached to that handle.
-
-\subsubsection{Flushing Buffers}
-\label{Flushing}
-\index{flushing a file buffer}
-
-Computation @hFlush@~"hdl"\indextt{hFlush} causes any items buffered for output in
-handle "hdl" to be sent immediately to the operating system.
-
-{\em Error reporting}: the @hFlush@ computation may fail with:
-@isFullError@ if the device is full; @isPermissionError@ if a
-system resource limit would be exceeded.  It is unspecified whether the
-characters in the buffer are discarded or retained under these circumstances.
-
-\subsection{Repositioning Handles}
-\label{Seeking}
-\index{random access files}
-\index{seeking a file}
-
-\subsubsection{Revisiting an I/O Position}
-
-Computation @hGetPosn@~"hdl"\indextt{hGetPosn} returns the current I/O position of "hdl" as a
-value of the abstract type @HandlePosn@.  If a call to "@hGetPosn@~h" returns a position "p",
-then computation @hSetPosn@~"p"\indextt{hSetPosn} sets the
-position of "h" to the position it held at the time of the call to @hGetPosn@.
-
-
-{\em Error reporting}: the @hSetPosn@ computation may fail with:
-@isPermissionError@ if a system resource limit would be exceeded.
-
-\subsubsection{Seeking to a new Position}
-
-Computation @hSeek@~"hdl"~"mode"~"i"\indextt{hSeek} sets the position of handle
-"hdl" depending on "mode".\indextycon{SeekMode}  If "mode" is:
-\begin{itemize}
-\item
-@AbsoluteSeek@:\indextt{AbsoluteSeek} the position of "hdl" is set to "i".
-\item
-@RelativeSeek@:\indextt{RelativeSeek} the position of "hdl" is set to offset "i" from
-the current position.
-\item
-@SeekFromEnd@:\indextt{SeekFromEnd} the position of "hdl" is set to offset "i" from
-the end of the file.
-\end{itemize}
-The offset is given in terms of 8-bit bytes.
-
-If "hdl" is block- or line-buffered, then seeking to a position which is not
-in the current buffer will first cause any items in the output buffer to be
-written to the device, and then cause the input buffer to be discarded.  Some
-handles may not be seekable (see @hIsSeekable@), or only support a subset of
-the possible positioning operations (for instance, it may only be possible to
-seek to the end of a tape, or to a positive offset from the beginning or
-current position).  It is not possible to set a negative I/O position, or for
-a physical file, an I/O position beyond the current end-of-file.
-
-{\em Error reporting}:
-the @hSeek@ computation may fail with:
-@isPermissionError@ if a system resource limit would be exceeded.
-
-\subsection{Handle Properties}
-\label{Query}
-
-The functions 
-@hIsOpen@\indextt{hIsOpen}, 
-@hIsClosed@\indextt{hIsClosed},
-@hIsReadable@\indextt{hIsReadable},
-@hIsWritable@\indextt{hIsWritable} and
-@hIsSeekable@\indextt{hIsSeekable}
-return information about the properties of a handle.
-Each of these returns @True@ if the handle has the specified property, and
-@False@ otherwise.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%
-%% Haskell 1.3 Text Input: LibReadTextIO
-%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\subsection{Text Input and Output}
-\index{reading from a file}
-%\indextt{LibReadTextIO}
-
-Here we define a standard set of input operations for reading
-characters and strings from text files, using handles.  Many of these
-functions are generalizations of Prelude functions.  I/O in the
-Prelude generally uses @stdin@ and @stdout@; here, handles are explicitly
-specified by the I/O operation.
-
-\subsubsection{Checking for Input}
-\label{hReady}
-\label{hWaitForInput}
-\index{polling a handle for input}
-
-Computation @hWaitForInput@~"hdl"~"t"\indextt{hWaitForInput} 
-waits until input is available on handle "hdl".
-It returns @True@ as soon as input is available on "hdl", or @False@ if no input is available
-within "t" milliseconds.
-
-Computation @hReady@~"hdl"\indextt{hReady} indicates whether at least one item is
-available for input from handle "hdl".
-
-{\em Error reporting}:
-the @hWaitForInput@ and @hReady@ computations fail with
-@isEOFError@ if the end of file has been reached.
-
-\subsubsection{Reading Input}
-
-Computation @hGetChar@~"hdl"\indextt{hGetChar} reads a character from
-the file or channel managed by "hdl".
-
-Computation @hGetLine@~"hdl"\indextt{hGetLine} reads a line from the file or
-channel managed by "hdl". The Prelude's @getLine@ is a shorthand
-for @hGetLine stdin@.
-
-{\em Error reporting}:
-the @hGetChar@ computation fails with
-@isEOFError@ if the end of file has been reached.
-The @hGetLine@ computation fails with @isEOFError@ if the end of file is encountered
-when reading the {\em first} character of the line. If @hGetLine@ encounters
-end-of-file at any other point while reading in a line, it is treated as
-a line terminator and the (partial) line is returned.
-
-
-\subsubsection{Reading Ahead}
-\label{hLookAhead}
-\index{lookahead}
-
-Computation @hLookAhead@~"hdl"\indextt{hLookAhead} returns the next character from handle
-"hdl" without removing it from the input buffer, blocking until a
-character is available.
-
-{\em Error reporting}:
-the @hLookAhead@ computation may fail with:
-@isEOFError@ if the end of file has been reached.
-
-\subsubsection{Reading The Entire Input}
-\label{hGetContents}
-\index{get the contents of a file}
-
-Computation @hGetContents@~"hdl"\indextt{hGetContents} returns the list of
-characters corresponding to the unread portion of the channel or file managed
-by "hdl", which is made semi-closed.
-
-{\em Error reporting}:
-the @hGetContents@ computation may fail with:
-@isEOFError@ if the end of file has been reached.
-
-\subsubsection{Text Output}
-
-Computation @hPutChar@~"hdl"~"c"\indextt{hPutChar} writes the character "c" to the file
-or channel managed by "hdl".  Characters may be buffered if buffering
-is enabled for "hdl".
-
-Computation @hPutStr@~"hdl"~"s"\indextt{hPutStr} writes the string
-"s" to the file or channel managed by "hdl".
-
-Computation @hPrint@~"hdl"~"t"\indextt{hPrint} writes the string representation of "t"
-given by the @shows@ function to the file or channel managed by "hdl" and appends a newline.
-
-{\em Error reporting}:
-the @hPutChar@, @hPutStr@ and @hPrint@ computations may fail with:
-@isFull@-@Error@ if the device is full;
-or @isPermissionError@ if another system resource limit would be exceeded.
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%
-%% Haskell 1.3 Examples
-%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\subsection{Examples}
-\index{input/output examples}
-
-Here are some simple examples to illustrate \Haskell{} I/O.
-
-\subsubsection{Summing Two Numbers}
-
-This program reads and sums two @Integer@s.
-\bprog
-@
-import IO
-
-main = do
-         hSetBuffering stdout NoBuffering            
-         putStr   "Enter an integer: "        
-         x1 <- readNum 
-         putStr   "Enter another integer: "          
-         x2 <- readNum                          
-         putStr  ("Their sum is " ++ show (x1+x2) ++ "\n")
-       where readNum :: IO Integer
-               -- Providing a type signature avoids reliance on
-               -- the defaulting rule to fix the type of x1,x2
-             readNum = readLn
-@
-\eprog
-
-\subsubsection{Copying Files}
-
-A simple program to create a copy of a file, with all lower-case
-characters translated to upper-case.  This program will not allow a
-file to be copied to itself.  This version uses character-level I/O.
-Note that exactly two arguments must be supplied to the program.
-\bprog
-@
-import IO
-import System
-import Char( toUpper )
-
-main = do 
-         [f1,f2] <- getArgs
-         h1 <- openFile f1 ReadMode     
-         h2 <- openFile f2 WriteMode 
-         copyFile h1 h2            
-         hClose h1                  
-         hClose h2
-
-copyFile h1 h2 = do
-                   eof <- hIsEOF h1
-                   if eof then return () else
-                      do
-                        c <- hGetChar h1
-                        hPutChar h2 (toUpper c)   
-                        copyFile h1 h2
-@
-\eprog
-
-An equivalent but much shorter version, using string I/O is:
-\bprog
-@
-import System
-import Char( toUpper )
-
-main = do
-         [f1,f2] <- getArgs
-         s <- readFile f1
-         writeFile f2 (map toUpper s)
-@
-\eprog
-
-%      Not any more in Haskell 98!
-% The @~@ used in the patterns above is a necessary consequence of the
-% @do@-notation which has been used for the I/O operations.  In general,
-% if the pattern on the left of any @<-@ fails to match, the value of
-% the entire @do@-expression is defined to be the ``zero'' in the
-% underlying monad.  However, since the @IO@ monad has no zero, the @~@
-% is required in order to force the pattern to be irrefutable.  Without
-% the @~@, a class error would occur because there is no instance of
-% @IO@ for class @MonadZero@.
-
-\subsection{Library @IO@}
-
-\inputHS{lib-code/IO}
-
-%**~footer
diff --git a/report/ix.verb b/report/ix.verb
deleted file mode 100644 (file)
index 7f99be4..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-%**<title>The Haskell 98 Library Report: Indexing Operations</title>
-%**~header
-\section{Indexing Operations}
-
-\outline{
-\inputHS{lib-hdrs/Ix}
-}
-The @Ix@ class is used to map a contiguous subrange of values in a
-type onto integers.  It is used primarily for array indexing (see
-Chapter~\ref{arrays}).
-The @Ix@ class contains the methods @range@\indextt{range},
-@index@\indextt{index}, and @inRange@\indextt{inRange}. 
-The @index@ operation maps a bounding pair, which defines the lower
-and upper bounds of the range, and a 
-subscript, to an integer.  The @range@ operation enumerates all
-subscripts; the @inRange@ operation tells whether a particular subscript
-lies in the range defined by a bounding pair.
-
-An implementation is entitled to assume the following laws about these
-operations:
-\bprog
-@
-   range (l,u) !! index (l,u) i == i   -- when i is in range
-   inRange (l,u) i             == i `elem` range (l,u)
-   map index (range (l,u))      == [0..rangeSize (l,u)]
-@
-\eprog
-
-% It is the responsibility of the programmer to enforce bounds
-% checking for non-derived instances of class @Ix@, if desired.
-% An implementation is not required to check that an index
-% lies within the bounds of an array when accessing that array.
-
-\subsection{Deriving Instances of @Ix@}
-\indexdi{Ix}
-
-It is possible to derive an instance of @Ix@ automatically, using
-a @deriving@ clause on a @data@ declaration (Section~\ref{derived-decls}).
-Such derived instance declarations for the class @Ix@ are only possible
-for enumerations\index{enumeration} (i.e.~datatypes having
-only nullary constructors) and single-constructor datatypes,
-whose constituent types are instances of @Ix@.   A Haskell implementation
-must provide @Ix@ instances for tuples up to at least size 15.
-
-\begin{itemize}
-\item
-For an {\em enumeration}, the nullary constructors are assumed to be
-numbered left-to-right with the indices being $0$ to $n-1\/$ inclusive.
-This is the same numbering defined by the @Enum@ class.  For example,
-given the datatype:
-\bprog
-@
-data Colour = Red | Orange | Yellow | Green | Blue | Indigo | Violet
-@
-\eprog
-we would have:
-\bprog
-@
-range   (Yellow,Blue)        ==  [Yellow,Green,Blue]
-index   (Yellow,Blue) Green  ==  1
-inRange (Yellow,Blue) Red    ==  False
-@
-\eprog
-\item
-For {\em single-constructor datatypes}, the derived instance declarations
-are as shown for tuples in
-Figure~\ref{prelude-index}.
-\end{itemize}
-
-\begin{figure}[tb]
-\begin{outlineenv}\small
-@
-instance  (Ix a, Ix b)  => Ix (a,b) where
-        range ((l,l'),(u,u'))
-                = [(i,i') | i <- range (l,u), i' <- range (l',u')]
-        index ((l,l'),(u,u')) (i,i')
-                =  index (l,u) i * rangeSize (l',u') + index (l',u') i'
-        inRange ((l,l'),(u,u')) (i,i')
-                = inRange (l,u) i && inRange (l',u') i'
-
--- Instances for other tuples are obtained from this scheme:
---
---  instance  (Ix a1, Ix a2, ... , Ix ak) => Ix (a1,a2,...,ak)  where
---      range ((l1,l2,...,lk),(u1,u2,...,uk)) =
---          [(i1,i2,...,ik) | i1 <- range (l1,u1),
---                            i2 <- range (l2,u2),
---                            ...
---                            ik <- range (lk,uk)]
---
---      index ((l1,l2,...,lk),(u1,u2,...,uk)) (i1,i2,...,ik) =
---        index (lk,uk) ik + rangeSize (lk,uk) * (
---         index (lk-1,uk-1) ik-1 + rangeSize (lk-1,uk-1) * (
---          ...
---           index (l1,u1)))
---
---      inRange ((l1,l2,...lk),(u1,u2,...,uk)) (i1,i2,...,ik) =
---          inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
---              ... && inRange (lk,uk) ik
-@
-\end{outlineenv}
-\ecaption{Derivation of Ix instances}
-\label{prelude-index}
-\indexclass{Ix}                                                
-\indextt{range}\indextt{index}\indextt{inRange}   
-\indextt{rangeSize}                                         
-\end{figure}
-
-\clearpage
-\subsection{Library {\tt Ix}}
-\inputHS{lib-code/Ix}
-
-%**~footer
diff --git a/report/lib-code/Array.hs b/report/lib-code/Array.hs
deleted file mode 100644 (file)
index ad100bf..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-module  Array ( 
-    module Ix,  -- export all of Ix 
-    Array, array, listArray, (!), bounds, indices, elems, assocs, 
-    accumArray, (//), accum, ixmap ) where
-
-import Ix
-import List( (\\) )
-
-infixl 9  !, //
-
-data (Ix a) => Array a b = MkArray (a,a) (a -> b) deriving ()
-
-array       :: (Ix a) => (a,a) -> [(a,b)] -> Array a b
-array b ivs =
-    if and [inRange b i | (i,_) <- ivs]
-        then MkArray b
-                     (\j -> case [v | (i,v) <- ivs, i == j] of
-                            [v]   -> v
-                            []    -> error "Array.!: \
-                                           \undefined array element"
-                            _     -> error "Array.!: \
-                                           \multiply defined array element")
-        else error "Array.array: out-of-range array association"
-
-listArray             :: (Ix a) => (a,a) -> [b] -> Array a b
-listArray b vs        =  array b (zipWith (\ a b -> (a,b)) (range b) vs)
-
-(!)                   :: (Ix a) => Array a b -> a -> b
-(!) (MkArray _ f)     =  f
-
-bounds                :: (Ix a) => Array a b -> (a,a)
-bounds (MkArray b _)  =  b
-
-indices               :: (Ix a) => Array a b -> [a]
-indices               =  range . bounds
-
-elems                 :: (Ix a) => Array a b -> [b]
-elems a               =  [a!i | i <- indices a]
-
-assocs                :: (Ix a) => Array a b -> [(a,b)]
-assocs a              =  [(i, a!i) | i <- indices a]
-
-(//)                  :: (Ix a) => Array a b -> [(a,b)] -> Array a b
-a // new_ivs          = array (bounds a) (old_ivs ++ new_ivs)
-                      where
-                       old_ivs = [(i,a!i) | i <- indices a,
-                                             i `notElem` new_is]
-                       new_is  = [i | (i,_) <- new_ivs]
-
-accum                 :: (Ix a) => (b -> c -> b) -> Array a b -> [(a,c)]
-                                   -> Array a b
-accum f               =  foldl (\a (i,v) -> a // [(i,f (a!i) v)])
-
-accumArray            :: (Ix a) => (b -> c -> b) -> b -> (a,a) -> [(a,c)]
-                                   -> Array a b
-accumArray f z b      =  accum f (array b [(i,z) | i <- range b])
-
-ixmap                 :: (Ix a, Ix b) => (a,a) -> (a -> b) -> Array b c
-                                         -> Array a c
-ixmap b f a           = array b [(i, a ! f i) | i <- range b]
-
-instance  (Ix a)          => Functor (Array a) where
-    fmap fn (MkArray b f) =  MkArray b (fn . f) 
-
-instance  (Ix a, Eq b)  => Eq (Array a b)  where
-    a == a' =  assocs a == assocs a'
-
-instance  (Ix a, Ord b) => Ord (Array a b)  where
-    a <= a' =  assocs a <= assocs a'
-
-instance  (Ix a, Show a, Show b) => Show (Array a b)  where
-    showsPrec p a = showParen (p > arrPrec) (
-                    showString "array " .
-                    showsPrec (arrPrec+1) (bounds a) . showChar ' ' .
-                    showsPrec (arrPrec+1) (assocs a)                  )
-
-instance  (Ix a, Read a, Read b) => Read (Array a b)  where
-    readsPrec p = readParen (p > arrPrec)
-           (\r -> [ (array b as, u) 
-                  | ("array",s) <- lex r,
-                    (b,t)       <- readsPrec (arrPrec+1) s,
-                    (as,u)      <- readsPrec (arrPrec+1) t ])
-
--- Precedence of the 'array' function is that of application itself
-arrPrec = 10
diff --git a/report/lib-code/Char.hs b/report/lib-code/Char.hs
deleted file mode 100644 (file)
index ab08471..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-module Char ( 
-    isAscii, isLatin1, isControl, isPrint, isSpace, isUpper, isLower,
-    isAlpha, isDigit, isOctDigit, isHexDigit, isAlphaNum,
-    digitToInt, intToDigit,
-    toUpper, toLower,
-    ord, chr,
-    readLitChar, showLitChar, lexLitChar,
-
-        -- ...and what the Prelude exports
-    Char, String
-    ) where
-
-import Array         -- Used for character name table.
-import Numeric (readDec, readOct, lexDigits, readHex)
-import UnicodePrims  -- Source of primitive Unicode functions.
-
--- Character-testing operations
-isAscii, isLatin1, isControl, isPrint, isSpace, isUpper, isLower,
- isAlpha, isDigit, isOctDigit, isHexDigit, isAlphaNum :: Char -> Bool
-
-isAscii c                =  c < '\x80'
-
-isLatin1 c               =  c <= '\xff'
-
-isControl c              =  c < ' ' || c >= '\DEL' && c <= '\x9f'
-
-isPrint                  =  primUnicodeIsPrint
-
-isSpace c                =  c `elem` " \t\n\r\f\v\xA0"
-        -- Only Latin-1 spaces recognized
-
-isUpper                  =  primUnicodeIsUpper  -- 'A'..'Z'
-
-isLower                  =  primUnicodeIsLower  -- 'a'..'z'
-
-isAlpha c                =  isUpper c || isLower c
-
-isDigit c                =  c >= '0' && c <= '9'
-
-isOctDigit c             =  c >= '0' && c <= '7'
-
-isHexDigit c             =  isDigit c || c >= 'A' && c <= 'F' ||
-                                         c >= 'a' && c <= 'f'
-
-isAlphaNum               =  primUnicodeIsAlphaNum
-
-
--- Digit conversion operations
-digitToInt :: Char -> Int
-digitToInt c
-  | isDigit c            =  fromEnum c - fromEnum '0'
-  | c >= 'a' && c <= 'f' =  fromEnum c - fromEnum 'a' + 10
-  | c >= 'A' && c <= 'F' =  fromEnum c - fromEnum 'A' + 10
-  | otherwise            =  error "Char.digitToInt: not a digit"
-
-intToDigit :: Int -> Char
-intToDigit i
-  | i >= 0  && i <=  9   =  toEnum (fromEnum '0' + i)
-  | i >= 10 && i <= 15   =  toEnum (fromEnum 'a' + i - 10)
-  | otherwise            =  error "Char.intToDigit: not a digit"
-
-
--- Case-changing operations
-toUpper :: Char -> Char
-toUpper =  primUnicodeToUpper
-        
-toLower :: Char -> Char
-toLower =  primUnicodeToLower
-
--- Character code functions
-ord  :: Char -> Int
-ord  =  fromEnum
-     
-chr  :: Int  -> Char
-chr  =  toEnum
-
--- Text functions
-readLitChar          :: ReadS Char
-readLitChar ('\\':s) =  readEsc s
-readLitChar (c:s)    =  [(c,s)]
-
-readEsc          :: ReadS Char
-readEsc ('a':s)  = [('\a',s)]
-readEsc ('b':s)  = [('\b',s)]
-readEsc ('f':s)  = [('\f',s)]
-readEsc ('n':s)  = [('\n',s)]
-readEsc ('r':s)  = [('\r',s)]
-readEsc ('t':s)  = [('\t',s)]
-readEsc ('v':s)  = [('\v',s)]
-readEsc ('\\':s) = [('\\',s)]
-readEsc ('"':s)  = [('"',s)]
-readEsc ('\'':s) = [('\'',s)]
-readEsc ('^':c:s) | c >= '@' && c <= '_'
-                 = [(chr (ord c - ord '@'), s)]
-readEsc s@(d:_) | isDigit d
-                 = [(chr n, t) | (n,t) <- readDec s]
-readEsc ('o':s)  = [(chr n, t) | (n,t) <- readOct s]
-readEsc ('x':s)  = [(chr n, t) | (n,t) <- readHex s]
-readEsc s@(c:_) | isUpper c
-                 = let table = ('\DEL', "DEL") : assocs asciiTab
-                   in case [(c,s') | (c, mne) <- table,
-                                     ([],s') <- [match mne s]]
-                      of (pr:_) -> [pr]
-                         []     -> []
-readEsc _        = []
-
-match                         :: (Eq a) => [a] -> [a] -> ([a],[a])
-match (x:xs) (y:ys) | x == y  =  match xs ys
-match xs     ys               =  (xs,ys)
-
-showLitChar               :: Char -> ShowS
-showLitChar c | c > '\DEL' =  showChar '\\' . 
-                              protectEsc isDigit (shows (ord c))
-showLitChar '\DEL'         =  showString "\\DEL"
-showLitChar '\\'           =  showString "\\\\"
-showLitChar c | c >= ' '   =  showChar c
-showLitChar '\a'           =  showString "\\a"
-showLitChar '\b'           =  showString "\\b"
-showLitChar '\f'           =  showString "\\f"
-showLitChar '\n'           =  showString "\\n"
-showLitChar '\r'           =  showString "\\r"
-showLitChar '\t'           =  showString "\\t"
-showLitChar '\v'           =  showString "\\v"
-showLitChar '\SO'          =  protectEsc (== 'H') (showString "\\SO")
-showLitChar c              =  showString ('\\' : asciiTab!c)
-
-protectEsc p f             = f . cont
-                             where cont s@(c:_) | p c = "\\&" ++ s
-                                   cont s             = s
-asciiTab = listArray ('\NUL', ' ')
-           ["NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL",
-            "BS",  "HT",  "LF",  "VT",  "FF",  "CR",  "SO",  "SI", 
-            "DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB",
-            "CAN", "EM",  "SUB", "ESC", "FS",  "GS",  "RS",  "US", 
-            "SP"] 
-
-lexLitChar          :: ReadS String
-lexLitChar ('\\':s) =  map (prefix '\\') (lexEsc s)
-        where
-          lexEsc (c:s)     | c `elem` "abfnrtv\\\"'" = [([c],s)]
-          lexEsc ('^':c:s) | c >= '@' && c <= '_'    = [(['^',c],s)]
-
-          -- Numeric escapes
-          lexEsc ('o':s)               = [prefix 'o' (span isOctDigit s)]
-          lexEsc ('x':s)               = [prefix 'x' (span isHexDigit s)]
-          lexEsc s@(d:_)   | isDigit d = [span isDigit s]
-
-          -- Very crude approximation to \XYZ.
-          lexEsc s@(c:_)   | isUpper c = [span isCharName s]
-          lexEsc _                     = []
-
-          isCharName c   = isUpper c || isDigit c
-          prefix c (t,s) = (c:t, s)
-
-lexLitChar (c:s)    =  [([c],s)]
-lexLitChar ""       =  []
-
diff --git a/report/lib-code/Complex.hs b/report/lib-code/Complex.hs
deleted file mode 100644 (file)
index cbfaee0..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-
-module Complex(Complex((:+)), realPart, imagPart, conjugate, mkPolar,
-               cis, polar, magnitude, phase)  where
-
-infix  6  :+
-
-data  (RealFloat a)     => Complex a = !a :+ !a  deriving (Eq,Read,Show)
-
-
-realPart, imagPart :: (RealFloat a) => Complex a -> a
-realPart (x:+y)         =  x
-imagPart (x:+y)         =  y
-
-conjugate       :: (RealFloat a) => Complex a -> Complex a
-conjugate (x:+y) =  x :+ (-y)
-
-mkPolar                 :: (RealFloat a) => a -> a -> Complex a
-mkPolar r theta         =  r * cos theta :+ r * sin theta
-
-cis             :: (RealFloat a) => a -> Complex a
-cis theta       =  cos theta :+ sin theta
-
-polar           :: (RealFloat a) => Complex a -> (a,a)
-polar z                 =  (magnitude z, phase z)
-
-magnitude :: (RealFloat a) => Complex a -> a
-magnitude (x:+y) =  scaleFloat k
-                    (sqrt ((scaleFloat mk x)^2 + (scaleFloat mk y)^2))
-                   where k  = max (exponent x) (exponent y)
-                         mk = - k
-
-phase :: (RealFloat a) => Complex a -> a
-phase (0 :+ 0) = 0
-phase (x :+ y) = atan2 y x
-
-
-instance  (RealFloat a) => Num (Complex a)  where
-    (x:+y) + (x':+y')  =  (x+x') :+ (y+y')
-    (x:+y) - (x':+y')  =  (x-x') :+ (y-y')
-    (x:+y) * (x':+y')  =  (x*x'-y*y') :+ (x*y'+y*x')
-    negate (x:+y)      =  negate x :+ negate y
-    abs z              =  magnitude z :+ 0
-    signum 0           =  0
-    signum z@(x:+y)    =  x/r :+ y/r  where r = magnitude z
-    fromInteger n      =  fromInteger n :+ 0
-
-instance  (RealFloat a) => Fractional (Complex a)  where
-    (x:+y) / (x':+y')  =  (x*x''+y*y'') / d :+ (y*x''-x*y'') / d
-                          where x'' = scaleFloat k x'
-                                y'' = scaleFloat k y'
-                                k   = - max (exponent x') (exponent y')
-                                d   = x'*x'' + y'*y''
-
-    fromRational a     =  fromRational a :+ 0
-
-instance  (RealFloat a) => Floating (Complex a)        where
-    pi             =  pi :+ 0
-    exp (x:+y)     =  expx * cos y :+ expx * sin y
-                      where expx = exp x
-    log z          =  log (magnitude z) :+ phase z
-
-    sqrt 0         =  0
-    sqrt z@(x:+y)  =  u :+ (if y < 0 then -v else v)
-                      where (u,v) = if x < 0 then (v',u') else (u',v')
-                            v'    = abs y / (u'*2)
-                            u'    = sqrt ((magnitude z + abs x) / 2)
-
-    sin (x:+y)     =  sin x * cosh y :+ cos x * sinh y
-    cos (x:+y)     =  cos x * cosh y :+ (- sin x * sinh y)
-    tan (x:+y)     =  (sinx*coshy:+cosx*sinhy)/(cosx*coshy:+(-sinx*sinhy))
-                      where sinx  = sin x
-                            cosx  = cos x
-                            sinhy = sinh y
-                            coshy = cosh y
-
-    sinh (x:+y)    =  cos y * sinh x :+ sin  y * cosh x
-    cosh (x:+y)    =  cos y * cosh x :+ sin y * sinh x
-    tanh (x:+y)    =  (cosy*sinhx:+siny*coshx)/(cosy*coshx:+siny*sinhx)
-                      where siny  = sin y
-                            cosy  = cos y
-                            sinhx = sinh x
-                            coshx = cosh x
-
-    asin z@(x:+y)  =  y':+(-x')
-                      where  (x':+y') = log (((-y):+x) + sqrt (1 - z*z))
-    acos z@(x:+y)  =  y'':+(-x'')
-                      where (x'':+y'') = log (z + ((-y'):+x'))
-                            (x':+y')   = sqrt (1 - z*z)
-    atan z@(x:+y)  =  y':+(-x')
-                      where (x':+y') = log (((1-y):+x) / sqrt (1+z*z))
-
-    asinh z        =  log (z + sqrt (1+z*z))
-    acosh z        =  log (z + (z+1) * sqrt ((z-1)/(z+1)))
-    atanh z        =  log ((1+z) / sqrt (1-z*z))
diff --git a/report/lib-code/IO.hs b/report/lib-code/IO.hs
deleted file mode 100644 (file)
index 6c29939..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-module IO {- export list omitted -} where
-
--- Just provide an implementation of the system-independent
--- actions that IO exports.
-
-try            :: IO a -> IO (Either IOError a)
-try f          =  catch (do r <- f
-                            return (Right r))
-                        (return . Left)
-
-bracket        :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c
-bracket before after m = do
-        x  <- before
-        rs <- try (m x)
-        after x
-        case rs of
-           Right r -> return r
-           Left  e -> ioError e
-
--- variant of the above where middle computation doesn't want x
-bracket_        :: IO a -> (a -> IO b) -> IO c -> IO c
-bracket_ before after m = do
-         x  <- before
-         rs <- try m
-         after x
-         case rs of
-            Right r -> return r
-            Left  e -> ioError e
diff --git a/report/lib-code/Ix.hs b/report/lib-code/Ix.hs
deleted file mode 100644 (file)
index e379aac..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-module Ix ( Ix(range, index, inRange, rangeSize) ) where
-
-class  Ord a => Ix a  where
-    range     :: (a,a) -> [a]
-    index     :: (a,a) -> a -> Int
-    inRange   :: (a,a) -> a -> Bool
-    rangeSize :: (a,a) -> Int
-
-    rangeSize b@(l,h) | null (range b) = 0
-                      | otherwise      = index b h + 1 
-       -- NB: replacing "null (range b)" by  "not (l <= h)"
-       -- fails if the bounds are tuples.  For example,
-       --      (1,2) <= (2,1)
-       -- but the range is nevertheless empty
-       --      range ((1,2),(2,1)) = []
-
-instance  Ix Char  where
-    range (m,n)                = [m..n]
-    index b@(c,c') ci
-        | inRange b ci  =  fromEnum ci - fromEnum c
-        | otherwise     =  error "Ix.index: Index out of range."
-    inRange (c,c') i    =  c <= i && i <= c'
-
-instance  Ix Int  where
-    range (m,n)                = [m..n]
-    index b@(m,n) i
-        | inRange b i   =  i - m
-        | otherwise     =  error "Ix.index: Index out of range."
-    inRange (m,n) i     =  m <= i && i <= n
-
-instance  Ix Integer  where
-    range (m,n)                = [m..n]
-    index b@(m,n) i
-        | inRange b i   =  fromInteger (i - m)
-        | otherwise     =  error "Ix.index: Index out of range."
-    inRange (m,n) i     =  m <= i && i <= n
-
-instance (Ix a,Ix b) => Ix (a, b) -- as derived, for all tuples
-instance Ix Bool                  -- as derived
-instance Ix Ordering              -- as derived
-instance Ix ()                    -- as derived
diff --git a/report/lib-code/List.hs b/report/lib-code/List.hs
deleted file mode 100644 (file)
index 0300b1b..0000000
+++ /dev/null
@@ -1,270 +0,0 @@
-module List ( 
-    elemIndex, elemIndices,
-    find, findIndex, findIndices,
-    nub, nubBy, delete, deleteBy, (\\), deleteFirstsBy,
-    union, unionBy, intersect, intersectBy,
-    intersperse, transpose, partition, group, groupBy,
-    inits, tails, isPrefixOf, isSuffixOf,
-    mapAccumL, mapAccumR,
-    sort, sortBy, insert, insertBy, maximumBy, minimumBy,
-    genericLength, genericTake, genericDrop,
-    genericSplitAt, genericIndex, genericReplicate,
-    zip4, zip5, zip6, zip7,
-    zipWith4, zipWith5, zipWith6, zipWith7,
-    unzip4, unzip5, unzip6, unzip7, unfoldr,
-
-    -- ...and what the Prelude exports
-    -- []((:), []),    -- This is built-in syntax
-    map, (++), concat, filter,
-    head, last, tail, init, null, length, (!!),
-    foldl, foldl1, scanl, scanl1, foldr, foldr1, scanr, scanr1,
-    iterate, repeat, replicate, cycle,
-    take, drop, splitAt, takeWhile, dropWhile, span, break,
-    lines, words, unlines, unwords, reverse, and, or,
-    any, all, elem, notElem, lookup,
-    sum, product, maximum, minimum, concatMap, 
-    zip, zip3, zipWith, zipWith3, unzip, unzip3
-    ) where
-
-import Maybe( listToMaybe )
-
-infix 5 \\
-
-elemIndex               :: Eq a => a -> [a] -> Maybe Int
-elemIndex x             =  findIndex (x ==)
-        
-elemIndices             :: Eq a => a -> [a] -> [Int]
-elemIndices x           =  findIndices (x ==)
-                        
-find                    :: (a -> Bool) -> [a] -> Maybe a
-find p                  =  listToMaybe . filter p
-
-findIndex               :: (a -> Bool) -> [a] -> Maybe Int
-findIndex p             =  listToMaybe . findIndices p
-
-findIndices             :: (a -> Bool) -> [a] -> [Int]
-findIndices p xs        =  [ i | (x,i) <- zip xs [0..], p x ]
-
-nub                     :: Eq a => [a] -> [a]
-nub                     =  nubBy (==)
-
-nubBy                   :: (a -> a -> Bool) -> [a] -> [a]
-nubBy eq []             =  []
-nubBy eq (x:xs)         =  x : nubBy eq (filter (\y -> not (eq x y)) xs)
-
-delete                  :: Eq a => a -> [a] -> [a]
-delete                  =  deleteBy (==)
-
-deleteBy                :: (a -> a -> Bool) -> a -> [a] -> [a]
-deleteBy eq x []        = []
-deleteBy eq x (y:ys)    = if x `eq` y then ys else y : deleteBy eq x ys
-
-(\\)                    :: Eq a => [a] -> [a] -> [a]
-(\\)                    =  foldl (flip delete)
-
-deleteFirstsBy          :: (a -> a -> Bool) -> [a] -> [a] -> [a]
-deleteFirstsBy eq       =  foldl (flip (deleteBy eq))
-
-union                   :: Eq a => [a] -> [a] -> [a]
-union                   =  unionBy (==)    
-
-unionBy                 :: (a -> a -> Bool) -> [a] -> [a] -> [a]
-unionBy eq xs ys        =  xs ++ deleteFirstsBy eq (nubBy eq ys) xs
-
-intersect               :: Eq a => [a] -> [a] -> [a]
-intersect               =  intersectBy (==)
-
-intersectBy             :: (a -> a -> Bool) -> [a] -> [a] -> [a]
-intersectBy eq xs ys    =  [x | x <- xs, any (eq x) ys]
-
-intersperse             :: a -> [a] -> [a]
-intersperse sep []      =  []
-intersperse sep [x]     =  [x]
-intersperse sep (x:xs)  =  x : sep : intersperse sep xs
-
--- transpose is lazy in both rows and columns,
---       and works for non-rectangular 'matrices'
--- For example, transpose [[1,2],[3,4,5],[]]  =  [[1,3],[2,4],[5]]
--- Note that [h | (h:t) <- xss] is not the same as (map head xss)
---      because the former discards empty sublists inside xss
-transpose                :: [[a]] -> [[a]]
-transpose []             = []
-transpose ([]     : xss) = transpose xss
-transpose ((x:xs) : xss) = (x : [h | (h:t) <- xss]) : 
-                           transpose (xs : [t | (h:t) <- xss])
-
-partition               :: (a -> Bool) -> [a] -> ([a],[a])
-partition p xs          =  (filter p xs, filter (not . p) xs)
-
--- group splits its list argument into a list of lists of equal, adjacent
--- elements.  e.g.,
--- group "Mississippi" == ["M","i","ss","i","ss","i","pp","i"]
-group                   :: Eq a => [a] -> [[a]]
-group                   =  groupBy (==)
-
-groupBy                 :: (a -> a -> Bool) -> [a] -> [[a]]
-groupBy eq []           =  []
-groupBy eq (x:xs)       =  (x:ys) : groupBy eq zs
-                           where (ys,zs) = span (eq x) xs
-
--- inits xs returns the list of initial segments of xs, shortest first.
--- e.g., inits "abc" == ["","a","ab","abc"]
-inits                   :: [a] -> [[a]]
-inits []                =  [[]]
-inits (x:xs)            =  [[]] ++ map (x:) (inits xs)
-
--- tails xs returns the list of all final segments of xs, longest first.
--- e.g., tails "abc" == ["abc", "bc", "c",""]
-tails                   :: [a] -> [[a]]
-tails []                =  [[]]
-tails xxs@(_:xs)        =  xxs : tails xs
-
-isPrefixOf               :: Eq a => [a] -> [a] -> Bool
-isPrefixOf []     _      =  True
-isPrefixOf _      []     =  False
-isPrefixOf (x:xs) (y:ys) =  x == y && isPrefixOf xs ys
-
-isSuffixOf              :: Eq a => [a] -> [a] -> Bool
-isSuffixOf x y          =  reverse x `isPrefixOf` reverse y
-
-mapAccumL               :: (a -> b -> (a, c)) -> a -> [b] -> (a, [c])
-mapAccumL f s []        =  (s, [])
-mapAccumL f s (x:xs)    =  (s'',y:ys)
-                           where (s', y ) = f s x
-                                 (s'',ys) = mapAccumL f s' xs
-
-mapAccumR               :: (a -> b -> (a, c)) -> a -> [b] -> (a, [c])
-mapAccumR f s []        =  (s, [])
-mapAccumR f s (x:xs)    =  (s'', y:ys)
-                           where (s'',y ) = f s' x
-                                 (s', ys) = mapAccumR f s xs
-
-unfoldr                 :: (b -> Maybe (a,b)) -> b -> [a]
-unfoldr f b             = case f b of
-                                Nothing    -> []
-                                Just (a,b) -> a : unfoldr f b
-
-sort                    :: (Ord a) => [a] -> [a]
-sort                    =  sortBy compare
-
-sortBy                  :: (a -> a -> Ordering) -> [a] -> [a]
-sortBy cmp              =  foldr (insertBy cmp) []
-
-insert                  :: (Ord a) => a -> [a] -> [a]
-insert                  = insertBy compare
-
-insertBy                :: (a -> a -> Ordering) -> a -> [a] -> [a]
-insertBy cmp x []       =  [x]
-insertBy cmp x ys@(y:ys')
-                        =  case cmp x y of
-                                GT -> y : insertBy cmp x ys'
-                                _  -> x : ys
-
-maximumBy               :: (a -> a -> Ordering) -> [a] -> a
-maximumBy cmp []        =  error "List.maximumBy: empty list"
-maximumBy cmp xs        =  foldl1 max xs
-                        where
-                           max x y = case cmp x y of
-                                        GT -> x
-                                        _  -> y
-
-minimumBy               :: (a -> a -> Ordering) -> [a] -> a
-minimumBy cmp []        =  error "List.minimumBy: empty list"
-minimumBy cmp xs        =  foldl1 min xs
-                        where
-                           min x y = case cmp x y of
-                                        GT -> y
-                                        _  -> x
-
-genericLength           :: (Integral a) => [b] -> a
-genericLength []        =  0
-genericLength (x:xs)    =  1 + genericLength xs
-
-genericTake             :: (Integral a) => a -> [b] -> [b]
-genericTake _ []        =  []
-genericTake 0 _         =  []
-genericTake n (x:xs) 
-   | n > 0              =  x : genericTake (n-1) xs
-   | otherwise          =  error "List.genericTake: negative argument"
-
-genericDrop             :: (Integral a) => a -> [b] -> [b]
-genericDrop 0 xs        =  xs
-genericDrop _ []        =  []
-genericDrop n (_:xs) 
-   | n > 0              =  genericDrop (n-1) xs
-   | otherwise          =  error "List.genericDrop: negative argument"
-
-genericSplitAt          :: (Integral a) => a -> [b] -> ([b],[b])
-genericSplitAt 0 xs     =  ([],xs)
-genericSplitAt _ []     =  ([],[])
-genericSplitAt n (x:xs) 
-   | n > 0              =  (x:xs',xs'')
-   | otherwise          =  error "List.genericSplitAt: negative argument"
-       where (xs',xs'') =  genericSplitAt (n-1) xs
-
-genericIndex            :: (Integral a) => [b] -> a -> b
-genericIndex (x:_)  0   =  x
-genericIndex (_:xs) n 
-        | n > 0         =  genericIndex xs (n-1)
-        | otherwise     =  error "List.genericIndex: negative argument"
-genericIndex _ _        =  error "List.genericIndex: index too large"
-
-genericReplicate        :: (Integral a) => a -> b -> [b]
-genericReplicate n x    =  genericTake n (repeat x)
-zip4                    :: [a] -> [b] -> [c] -> [d] -> [(a,b,c,d)]
-zip4                    =  zipWith4 (,,,)
-
-zip5                    :: [a] -> [b] -> [c] -> [d] -> [e] -> [(a,b,c,d,e)]
-zip5                    =  zipWith5 (,,,,)
-
-zip6                    :: [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> 
-                              [(a,b,c,d,e,f)]
-zip6                    =  zipWith6 (,,,,,)
-
-zip7                    :: [a] -> [b] -> [c] -> [d] -> [e] -> [f] ->
-                              [g] -> [(a,b,c,d,e,f,g)]
-zip7                    =  zipWith7 (,,,,,,)
-
-zipWith4                :: (a->b->c->d->e) -> [a]->[b]->[c]->[d]->[e]
-zipWith4 z (a:as) (b:bs) (c:cs) (d:ds)
-                        =  z a b c d : zipWith4 z as bs cs ds
-zipWith4 _ _ _ _ _      =  []
-
-zipWith5                :: (a->b->c->d->e->f) -> 
-                           [a]->[b]->[c]->[d]->[e]->[f]
-zipWith5 z (a:as) (b:bs) (c:cs) (d:ds) (e:es)
-                        =  z a b c d e : zipWith5 z as bs cs ds es
-zipWith5 _ _ _ _ _ _    =  []
-
-zipWith6                :: (a->b->c->d->e->f->g) ->
-                           [a]->[b]->[c]->[d]->[e]->[f]->[g]
-zipWith6 z (a:as) (b:bs) (c:cs) (d:ds) (e:es) (f:fs)
-                        =  z a b c d e f : zipWith6 z as bs cs ds es fs
-zipWith6 _ _ _ _ _ _ _  =  []
-
-zipWith7                :: (a->b->c->d->e->f->g->h) ->
-                           [a]->[b]->[c]->[d]->[e]->[f]->[g]->[h]
-zipWith7 z (a:as) (b:bs) (c:cs) (d:ds) (e:es) (f:fs) (g:gs)
-                   =  z a b c d e f g : zipWith7 z as bs cs ds es fs gs
-zipWith7 _ _ _ _ _ _ _ _ = []
-
-unzip4                  :: [(a,b,c,d)] -> ([a],[b],[c],[d])
-unzip4                  =  foldr (\(a,b,c,d) ~(as,bs,cs,ds) ->
-                                        (a:as,b:bs,c:cs,d:ds))
-                                 ([],[],[],[])
-
-unzip5                  :: [(a,b,c,d,e)] -> ([a],[b],[c],[d],[e])
-unzip5                  =  foldr (\(a,b,c,d,e) ~(as,bs,cs,ds,es) ->
-                                        (a:as,b:bs,c:cs,d:ds,e:es))
-                                 ([],[],[],[],[])
-
-unzip6                  :: [(a,b,c,d,e,f)] -> ([a],[b],[c],[d],[e],[f])
-unzip6                  =  foldr (\(a,b,c,d,e,f) ~(as,bs,cs,ds,es,fs) ->
-                                        (a:as,b:bs,c:cs,d:ds,e:es,f:fs))
-                                 ([],[],[],[],[],[])
-
-unzip7          :: [(a,b,c,d,e,f,g)] -> ([a],[b],[c],[d],[e],[f],[g])
-unzip7          =  foldr (\(a,b,c,d,e,f,g) ~(as,bs,cs,ds,es,fs,gs) ->
-                                (a:as,b:bs,c:cs,d:ds,e:es,f:fs,g:gs))
-                         ([],[],[],[],[],[],[])
diff --git a/report/lib-code/Locale.hs b/report/lib-code/Locale.hs
deleted file mode 100644 (file)
index b56a648..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-module Locale(TimeLocale(..), defaultTimeLocale) where
-
-data TimeLocale = TimeLocale {
-        wDays  :: [(String, String)],   -- full and abbreviated week days
-        months :: [(String, String)],   -- full and abbreviated months
-        amPm   :: (String, String),     -- AM/PM symbols
-        dateTimeFmt, dateFmt,           -- formatting strings
-          timeFmt, time12Fmt :: String     
-        } deriving (Eq, Ord, Show)
-
-defaultTimeLocale :: TimeLocale 
-defaultTimeLocale =  TimeLocale { 
-        wDays  = [("Sunday",   "Sun"),  ("Monday",    "Mon"),   
-                  ("Tuesday",  "Tue"),  ("Wednesday", "Wed"), 
-                  ("Thursday", "Thu"),  ("Friday",    "Fri"), 
-                  ("Saturday", "Sat")],
-
-        months = [("January",   "Jan"), ("February",  "Feb"),
-                  ("March",     "Mar"), ("April",     "Apr"),
-                  ("May",       "May"), ("June",      "Jun"),
-                  ("July",      "Jul"), ("August",    "Aug"),
-                  ("September", "Sep"), ("October",   "Oct"),
-                  ("November",  "Nov"), ("December",  "Dec")],
-
-        amPm = ("AM", "PM"),
-        dateTimeFmt = "%a %b %e %H:%M:%S %Z %Y",
-        dateFmt = "%m/%d/%y",
-        timeFmt = "%H:%M:%S",
-        time12Fmt = "%I:%M:%S %p"
-        }
diff --git a/report/lib-code/Maybe.hs b/report/lib-code/Maybe.hs
deleted file mode 100644 (file)
index f1eac52..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-module Maybe(
-    isJust, isNothing,
-    fromJust, fromMaybe, listToMaybe, maybeToList,
-    catMaybes, mapMaybe,
-
-    -- ...and what the Prelude exports
-    Maybe(Nothing, Just),
-    maybe
-  ) where
-
-isJust                 :: Maybe a -> Bool
-isJust (Just a)        =  True
-isJust Nothing         =  False
-
-isNothing             :: Maybe a -> Bool
-isNothing             =  not . isJust
-
-fromJust               :: Maybe a -> a
-fromJust (Just a)      =  a
-fromJust Nothing       =  error "Maybe.fromJust: Nothing"
-
-fromMaybe              :: a -> Maybe a -> a
-fromMaybe d Nothing    =  d
-fromMaybe d (Just a)   =  a
-
-maybeToList            :: Maybe a -> [a]
-maybeToList Nothing    =  []
-maybeToList (Just a)   =  [a]
-
-listToMaybe            :: [a] -> Maybe a
-listToMaybe []         =  Nothing
-listToMaybe (a:_)      =  Just a
-catMaybes              :: [Maybe a] -> [a]
-catMaybes ms           =  [ m | Just m <- ms ]
-
-mapMaybe               :: (a -> Maybe b) -> [a] -> [b]
-mapMaybe f             =  catMaybes . map f
diff --git a/report/lib-code/Monad.hs b/report/lib-code/Monad.hs
deleted file mode 100644 (file)
index 6d63563..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-module Monad (
-    MonadPlus(mzero, mplus),
-    join, guard, when, unless, ap,
-    msum,
-    filterM, mapAndUnzipM, zipWithM, zipWithM_, foldM, 
-    liftM, liftM2, liftM3, liftM4, liftM5,
-
-    -- ...and what the Prelude exports
-    Monad((>>=), (>>), return, fail),
-    Functor(fmap),
-    mapM, mapM_, sequence, sequence_, (=<<), 
-    ) where
-
-
--- The MonadPlus class definition
-
-class  (Monad m) => MonadPlus m  where
-    mzero  :: m a
-    mplus  :: m a -> m a -> m a
-
-
--- Instances of MonadPlus
-
-instance  MonadPlus Maybe  where
-    mzero                 = Nothing
-
-    Nothing `mplus` ys    =  ys
-    xs      `mplus` ys    =  xs
-
-instance  MonadPlus []  where
-    mzero =  []
-    mplus = (++)
-
-
--- Functions    
-
-
-msum            :: MonadPlus m => [m a] -> m a
-msum xs                 =  foldr mplus mzero xs
-
-join             :: (Monad m) => m (m a) -> m a
-join x           =  x >>= id
-
-when             :: (Monad m) => Bool -> m () -> m ()
-when p s         =  if p then s else return ()
-
-unless           :: (Monad m) => Bool -> m () -> m ()
-unless p s       =  when (not p) s
-
-ap               :: (Monad m) => m (a -> b) -> m a -> m b
-ap               =  liftM2 ($)
-
-guard            :: MonadPlus m => Bool -> m ()
-guard p          =  if p then return () else mzero
-
-mapAndUnzipM     :: (Monad m) => (a -> m (b,c)) -> [a] -> m ([b], [c])
-mapAndUnzipM f xs = sequence (map f xs) >>= return . unzip
-
-zipWithM         :: (Monad m) => (a -> b -> m c) -> [a] -> [b] -> m [c]
-zipWithM f xs ys =  sequence (zipWith f xs ys)
-
-zipWithM_         :: (Monad m) => (a -> b -> m c) -> [a] -> [b] -> m ()
-zipWithM_ f xs ys =  sequence_ (zipWith f xs ys)
-
-foldM            :: (Monad m) => (a -> b -> m a) -> a -> [b] -> m a
-foldM f a []     =  return a
-foldM f a (x:xs) =  f a x >>= \ y -> foldM f y xs
-
-filterM :: Monad m => (a -> m Bool) -> [a] -> m [a]
-filterM p []     = return []
-filterM p (x:xs) = do { b  <- p x;
-                       ys <- filterM p xs; 
-                       return (if b then (x:ys) else ys)
-                  }
-
-liftM            :: (Monad m) => (a -> b) -> (m a -> m b)
-liftM f          =  \a -> do { a' <- a; return (f a') }
-
-liftM2           :: (Monad m) => (a -> b -> c) -> (m a -> m b -> m c)
-liftM2 f         =  \a b -> do { a' <- a; b' <- b; return (f a' b') }
-
-liftM3           :: (Monad m) => (a -> b -> c -> d) ->
-                                 (m a -> m b -> m c -> m d)
-liftM3 f         =  \a b c -> do { a' <- a; b' <- b; c' <- c;
-                                  return (f a' b' c') }
-
-liftM4           :: (Monad m) => (a -> b -> c -> d -> e) ->
-                                 (m a -> m b -> m c -> m d -> m e)
-liftM4 f         =  \a b c d -> do { a' <- a; b' <- b; c' <- c; d' <- d;
-                                    return (f a' b' c' d') }
-
-liftM5           :: (Monad m) => (a -> b -> c -> d -> e -> f) ->
-                                 (m a -> m b -> m c -> m d -> m e -> m f)
-liftM5 f         =  \a b c d e -> do { a' <- a; b' <- b; c' <- c; d' <- d;
-                                      e' <- e; return (f a' b' c' d' e') }
-
-
diff --git a/report/lib-code/Numeric.hs b/report/lib-code/Numeric.hs
deleted file mode 100644 (file)
index 9dcf496..0000000
+++ /dev/null
@@ -1,341 +0,0 @@
-module Numeric(fromRat,
-               showSigned, showIntAtBase,
-               showInt, showOct, showHex,
-               readSigned, readInt,
-               readDec, readOct, readHex, 
-               floatToDigits,
-               showEFloat, showFFloat, showGFloat, showFloat, 
-               readFloat, lexDigits) where
-
-import Char   ( isDigit, isOctDigit, isHexDigit
-              , digitToInt, intToDigit )
-import Ratio  ( (%), numerator, denominator )
-import Array  ( (!), Array, array )
-
--- This converts a rational to a floating.  This should be used in the
--- Fractional instances of Float and Double.
-
-fromRat :: (RealFloat a) => Rational -> a
-fromRat x = 
-    if x == 0 then encodeFloat 0 0              -- Handle exceptional cases
-    else if x < 0 then - fromRat' (-x)          -- first.
-    else fromRat' x
-
--- Conversion process:
--- Scale the rational number by the RealFloat base until
--- it lies in the range of the mantissa (as used by decodeFloat/encodeFloat).
--- Then round the rational to an Integer and encode it with the exponent
--- that we got from the scaling.
--- To speed up the scaling process we compute the log2 of the number to get
--- a first guess of the exponent.
-fromRat' :: (RealFloat a) => Rational -> a
-fromRat' x = r
-  where b = floatRadix r
-        p = floatDigits r
-        (minExp0, _) = floatRange r
-        minExp = minExp0 - p            -- the real minimum exponent
-        xMin = toRational (expt b (p-1))
-        xMax = toRational (expt b p)
-        p0 = (integerLogBase b (numerator x) -
-              integerLogBase b (denominator x) - p) `max` minExp
-        f = if p0 < 0 then 1 % expt b (-p0) else expt b p0 % 1
-        (x', p') = scaleRat (toRational b) minExp xMin xMax p0 (x / f)
-        r = encodeFloat (round x') p'
-
--- Scale x until xMin <= x < xMax, or p (the exponent) <= minExp.
-scaleRat :: Rational -> Int -> Rational -> Rational -> 
-             Int -> Rational -> (Rational, Int)
-scaleRat b minExp xMin xMax p x =
-    if p <= minExp then
-        (x, p)
-    else if x >= xMax then
-        scaleRat b minExp xMin xMax (p+1) (x/b)
-    else if x < xMin  then
-        scaleRat b minExp xMin xMax (p-1) (x*b)
-    else
-        (x, p)
-
--- Exponentiation with a cache for the most common numbers.
-minExpt = 0::Int
-maxExpt = 1100::Int
-expt :: Integer -> Int -> Integer
-expt base n =
-    if base == 2 && n >= minExpt && n <= maxExpt then
-        expts!n
-    else
-        base^n
-
-expts :: Array Int Integer
-expts = array (minExpt,maxExpt) [(n,2^n) | n <- [minExpt .. maxExpt]]
-
--- Compute the (floor of the) log of i in base b.
--- Simplest way would be just divide i by b until it's smaller then b,
--- but that would be very slow!  We are just slightly more clever.
-integerLogBase :: Integer -> Integer -> Int
-integerLogBase b i =
-     if i < b then
-        0
-     else
-        -- Try squaring the base first to cut down the number of divisions.
-        let l = 2 * integerLogBase (b*b) i
-            doDiv :: Integer -> Int -> Int
-            doDiv i l = if i < b then l else doDiv (i `div` b) (l+1)
-        in  doDiv (i `div` (b^l)) l
-
-
--- Misc utilities to show integers and floats 
-
-showSigned :: Real a => (a -> ShowS) -> Int -> a -> ShowS
-showSigned showPos p x 
-  | x < 0     = showParen (p > 6) (showChar '-' . showPos (-x))
-  | otherwise = showPos x
-
--- showInt, showOct, showHex are used for positive numbers only
-showInt, showOct, showHex :: Integral a => a -> ShowS
-showOct = showIntAtBase  8 intToDigit
-showInt = showIntAtBase 10 intToDigit
-showHex = showIntAtBase 16 intToDigit
-
-showIntAtBase :: Integral a 
-             => a              -- base
-             -> (Int -> Char)  -- digit to char
-             -> a              -- number to show
-             -> ShowS
-showIntAtBase base intToDig n rest
-  | n < 0     = error "Numeric.showIntAtBase: can't show negative numbers"
-  | n' == 0   = rest'
-  | otherwise = showIntAtBase base intToDig n' rest'
-  where
-    (n',d) = quotRem n base
-    rest'  = intToDig (fromIntegral d) : rest
-
-
-readSigned :: (Real a) => ReadS a -> ReadS a
-readSigned readPos = readParen False read'
-                     where read' r  = read'' r ++
-                                      [(-x,t) | ("-",s) <- lex r,
-                                                (x,t)   <- read'' s]
-                           read'' r = [(n,s)  | (str,s) <- lex r,
-                                                (n,"")  <- readPos str]
-
-
--- readInt reads a string of digits using an arbitrary base.  
--- Leading minus signs must be handled elsewhere.
-
-readInt :: (Integral a) => a -> (Char -> Bool) -> (Char -> Int) -> ReadS a
-readInt radix isDig digToInt s =
-   [(foldl1 (\n d -> n * radix + d) (map (fromIntegral . digToInt) ds), r)
-          | (ds,r) <- nonnull isDig s ]
-
--- Unsigned readers for various bases
-readDec, readOct, readHex :: (Integral a) => ReadS a
-readDec = readInt 10 isDigit    digitToInt
-readOct = readInt  8 isOctDigit digitToInt
-readHex = readInt 16 isHexDigit digitToInt
-
-
-showEFloat     :: (RealFloat a) => Maybe Int -> a -> ShowS
-showFFloat     :: (RealFloat a) => Maybe Int -> a -> ShowS
-showGFloat     :: (RealFloat a) => Maybe Int -> a -> ShowS
-showFloat      :: (RealFloat a) => a -> ShowS
-
-showEFloat d x =  showString (formatRealFloat FFExponent d x)
-showFFloat d x =  showString (formatRealFloat FFFixed d x)
-showGFloat d x =  showString (formatRealFloat FFGeneric d x)
-showFloat      =  showGFloat Nothing 
-
--- These are the format types.  This type is not exported.
-
-data FFFormat = FFExponent | FFFixed | FFGeneric
-
-formatRealFloat :: (RealFloat a) => FFFormat -> Maybe Int -> a -> String
-formatRealFloat fmt decs x 
-  = s
-  where 
-    base = 10
-    s = if isNaN x then 
-            "NaN"
-        else if isInfinite x then 
-            if x < 0 then "-Infinity" else "Infinity"
-        else if x < 0 || isNegativeZero x then 
-            '-' : doFmt fmt (floatToDigits (toInteger base) (-x))
-        else 
-            doFmt fmt (floatToDigits (toInteger base) x)
-    
-    doFmt fmt (is, e)
-      = let 
-           ds = map intToDigit is
-        in  
-        case fmt of
-          FFGeneric -> 
-              doFmt (if e < 0 || e > 7 then FFExponent else FFFixed)
-                    (is, e)
-          FFExponent ->
-            case decs of
-              Nothing ->
-                case ds of
-                   []    -> "0.0e0"
-                   [d]   -> d : ".0e" ++ show (e-1)
-                   d:ds  -> d : '.' : ds ++ 'e':show (e-1)
-          
-              Just dec ->
-                let dec' = max dec 1 in
-                case is of
-                  [] -> '0':'.':take dec' (repeat '0') ++ "e0"
-                  _ ->
-                    let (ei, is') = roundTo base (dec'+1) is
-                        d:ds = map intToDigit
-                                   (if ei > 0 then init is' else is')
-                    in d:'.':ds  ++ "e" ++ show (e-1+ei)
-          
-          FFFixed ->
-            case decs of
-               Nothing         -- Always prints a decimal point
-                 | e > 0     -> take e (ds ++ repeat '0')
-                                ++ '.' : mk0 (drop e ds)
-                 | otherwise -> "0." ++ mk0 (replicate (-e) '0' ++ ds)
-              
-               Just dec ->  -- Print decimal point iff dec > 0
-                 let dec' = max dec 0 in
-                 if e >= 0 then
-                   let (ei, is') = roundTo base (dec' + e) is
-                       (ls, rs)  = splitAt (e+ei) 
-                                              (map intToDigit is')
-                   in  mk0 ls ++ mkdot0 rs
-                 else
-                   let (ei, is') = roundTo base dec' 
-                                           (replicate (-e) 0 ++ is)
-                       d : ds = map intToDigit 
-                                    (if ei > 0 then is' else 0:is')
-                   in  d : mkdot0 ds
-            where   
-              mk0 "" = "0"        -- Print 0.34, not .34
-              mk0 s  = s  
-    
-              mkdot0 "" = ""       -- Print 34, not 34.
-              mkdot0 s  = '.' : s  -- when the format specifies no
-                                  -- digits after the decimal point
-    
-
-roundTo :: Int -> Int -> [Int] -> (Int, [Int])
-roundTo base d is = case f d is of
-                (0, is) -> (0, is)
-                (1, is) -> (1, 1 : is)
-  where b2 = base `div` 2
-        f n [] = (0, replicate n 0)
-        f 0 (i:_) = (if i >= b2 then 1 else 0, [])
-        f d (i:is) = 
-            let (c, ds) = f (d-1) is
-                i' = c + i
-            in  if i' == base then (1, 0:ds) else (0, i':ds)
-
---
--- Based on "Printing Floating-Point Numbers Quickly and Accurately"
--- by R.G. Burger and R. K. Dybvig, in PLDI 96.
--- The version here uses a much slower logarithm estimator.  
--- It should be improved.
-
--- This function returns a non-empty list of digits (Ints in [0..base-1])
--- and an exponent.  In general, if
---      floatToDigits r = ([a, b, ... z], e)
--- then
---      r = 0.ab..z * base^e
--- 
-
-floatToDigits :: (RealFloat a) => Integer -> a -> ([Int], Int)
-
-floatToDigits _ 0 = ([], 0)
-floatToDigits base x =
-    let (f0, e0) = decodeFloat x
-        (minExp0, _) = floatRange x
-        p = floatDigits x
-        b = floatRadix x
-        minExp = minExp0 - p            -- the real minimum exponent
-
-        -- Haskell requires that f be adjusted so denormalized numbers
-        -- will have an impossibly low exponent.  Adjust for this.
-        f :: Integer
-        e :: Int
-        (f, e) = let n = minExp - e0
-                 in  if n > 0 then (f0 `div` (b^n), e0+n) else (f0, e0)
-
-        (r, s, mUp, mDn) =
-           if e >= 0 then
-               let be = b^e in
-               if f == b^(p-1) then
-                   (f*be*b*2, 2*b, be*b, b)
-               else
-                   (f*be*2, 2, be, be)
-           else
-               if e > minExp && f == b^(p-1) then
-                   (f*b*2, b^(-e+1)*2, b, 1)
-               else
-                   (f*2, b^(-e)*2, 1, 1)
-        k = 
-            let k0 =
-                    if b==2 && base==10 then
-                        -- logBase 10 2 is slightly bigger than 3/10 so
-                        -- the following will err on the low side.  Ignoring
-                        -- the fraction will make it err even more.
-                        -- Haskell promises that p-1 <= logBase b f < p.
-                        (p - 1 + e0) * 3 `div` 10
-                    else
-                        ceiling ((log (fromInteger (f+1)) + 
-                                 fromIntegral e * log (fromInteger b)) / 
-                                  log (fromInteger base))
-                fixup n =
-                    if n >= 0 then
-                        if r + mUp <= expt base n * s then n else fixup (n+1)
-                    else
-                        if expt base (-n) * (r + mUp) <= s then n
-                                                           else fixup (n+1)
-            in  fixup k0
-
-        gen ds rn sN mUpN mDnN =
-            let (dn, rn') = (rn * base) `divMod` sN
-                mUpN' = mUpN * base
-                mDnN' = mDnN * base
-            in  case (rn' < mDnN', rn' + mUpN' > sN) of
-                (True,  False) -> dn : ds
-                (False, True)  -> dn+1 : ds
-                (True,  True)  -> if rn' * 2 < sN then dn : ds else dn+1 : ds
-                (False, False) -> gen (dn:ds) rn' sN mUpN' mDnN'
-        rds =
-            if k >= 0 then
-                gen [] r (s * expt base k) mUp mDn
-            else
-                let bk = expt base (-k)
-                in  gen [] (r * bk) s (mUp * bk) (mDn * bk)
-    in  (map fromIntegral (reverse rds), k)
-
-
-
--- This floating point reader uses a less restrictive syntax for floating
--- point than the Haskell lexer.  The `.' is optional.
-
-readFloat     :: (RealFrac a) => ReadS a
-readFloat r    = [(fromRational ((n%1)*10^^(k-d)),t) | (n,d,s) <- readFix r,
-                                                       (k,t)   <- readExp s] ++
-                 [ (0/0, t) | ("NaN",t)      <- lex r] ++
-                 [ (1/0, t) | ("Infinity",t) <- lex r]
-               where 
-                 readFix r = [(read (ds++ds'), length ds', t)
-                             | (ds,d) <- lexDigits r,
-                               (ds',t) <- lexFrac d ]
-               
-                 lexFrac ('.':ds) = lexDigits ds
-                 lexFrac s        = [("",s)]        
-                 
-                 readExp (e:s) | e `elem` "eE" = readExp' s
-                 readExp s                     = [(0,s)]
-                 
-                 readExp' ('-':s) = [(-k,t) | (k,t) <- readDec s]
-                 readExp' ('+':s) = readDec s
-                 readExp' s       = readDec s
-
-lexDigits        :: ReadS String 
-lexDigits        =  nonnull isDigit
-
-nonnull          :: (Char -> Bool) -> ReadS String
-nonnull p s      =  [(cs,t) | (cs@(_:_),t) <- [span p s]]
-
diff --git a/report/lib-code/Random.hs b/report/lib-code/Random.hs
deleted file mode 100644 (file)
index 8a917d7..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-module Random (
-       RandomGen(next, split, genRange),
-       StdGen, mkStdGen,
-
-       Random( random,   randomR, 
-               randoms,  randomRs,
-               randomIO, randomRIO ),
-
-       getStdRandom,
-       getStdGen, setStdGen, newStdGen
-  ) where
-       
----------------- The RandomGen class ---------------------------
-
-class RandomGen g where
-  genRange :: g -> (Int, Int)
-  next     :: g -> (Int, g)
-  split    :: g -> (g, g)      -- May not exist for all RandomGens
-
-
----------------- A standard instance of RandomGen ---------------
-data StdGen = ...      -- Abstract
-
-instance RandomGen StdGen where ...
-
--- The show/read instances provide a primitive way to save
--- the state of a random number generator
--- It is expected read (show g) == g
-
-instance Read StdGen where ...
-       -- read succeeds on *any* string, not only those
-       -- constructed with show.  Hence you can use any
-       -- string as way to construct a RandomGen.
-       --   - read guarantees to consume a finite portion of
-       --     the string
-       --   - different strings are likely to result in 
-       --     different generators
-
-instance Show StdGen where ...
-
-mkStdGen :: Int -> StdGen
--- Make a StdGen from an Int.  Different Ints should result
--- in different generators.
-
-
----------------- The Random class ---------------------------
-
-class Random a where
-   randomR :: RandomGen g => (a, a) -> g -> (a, g)
-       -- Returns a random value uniformly distributed in [lo,hi]
-       -- It is unspecified what happens if lo > hi
-
-   random  :: RandomGen g => g -> (a, g)
-       -- Return any value of type a.
-       -- For bounded types, the range is normally the whole type
-       -- For Fractional types, the range is normally [0..1]
-       -- For Integer, the range is (arbitrarily) the range of Int
-
-   randomRs :: RandomGen g => (a, a) -> g -> [a]
-   randoms  :: RandomGen g => g -> [a]
-
-   randomIO :: IO a
-   randomRIO :: (a,a) -> IO a
-
-       -- Default methods
-   randoms g = x : randoms g' 
-            where 
-              (x,g') = random g
-   randomRs = ...similar...
-
-   randomIO        = getStdRandom random
-   randomRIO range = getStdRandom (randomR range)
-
-
-instance Random Int     where ...
-instance Random Integer where ...
-instance Random Float   where ...
-instance Random Double  where ...
-instance Random Bool    where ...
-instance Random Char    where ...
-
-
----------------- The global random generator ---------------------------
-
--- There is a single, implicit, global random number generator
--- of type StdGen, held in some global variable maintained by the IO monad
---
--- It is initialised non-deterministically; to get
--- deterministic behaviour use setStdGen.
-
-setStdGen :: StdGen -> IO ()   -- Set the global generator
-getStdGen :: IO StdGen -- Get the global generator
-
-getStdRandom :: (StdGen -> (a, StdGen)) -> IO a
-       -- Use the supplied function to get a value from
-       -- the current global random generator, g, and update the
-       -- global generator with the new generator returned
-getStdRandom f = do
-       g <- getStdGen
-       let (val, g') = f g
-       setStdGen g'
-       return val
-
-newStdGen :: IO StdGen
-       -- Apply split to the current global random generator
-       -- update it with one of the results and return the other
-newStdGen = do
-       g <- getStdGen
-       let (s1,s2) = split g
-       setStdGen s1
-       return s2
-
-
diff --git a/report/lib-code/Ratio.hs b/report/lib-code/Ratio.hs
deleted file mode 100644 (file)
index 10b0c84..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
--- Standard functions on rational numbers
-
-module  Ratio (
-    Ratio, Rational, (%), numerator, denominator, approxRational ) where
-
-infixl 7  %
-
-ratPrec = 7 :: Int
-
-data  (Integral a)      => Ratio a = !a :% !a  deriving (Eq)
-type  Rational          =  Ratio Integer
-
-(%)                     :: (Integral a) => a -> a -> Ratio a
-numerator, denominator  :: (Integral a) => Ratio a -> a
-approxRational          :: (RealFrac a) => a -> a -> Rational
-
-
--- "reduce" is a subsidiary function used only in this module.
--- It normalises a ratio by dividing both numerator
--- and denominator by their greatest common divisor.
---
--- E.g., 12 `reduce` 8    ==  3 :%   2
---       12 `reduce` (-8) ==  3 :% (-2)
-
-reduce _ 0              =  error "Ratio.% : zero denominator"
-reduce x y              =  (x `quot` d) :% (y `quot` d)
-                           where d = gcd x y
-
-x % y                   =  reduce (x * signum y) (abs y)
-
-numerator (x :% _)      =  x
-
-denominator (_ :% y)    =  y
-
-
-instance  (Integral a)  => Ord (Ratio a)  where
-    (x:%y) <= (x':%y')  =  x * y' <= x' * y
-    (x:%y) <  (x':%y')  =  x * y' <  x' * y
-
-instance  (Integral a)  => Num (Ratio a)  where
-    (x:%y) + (x':%y')   =  reduce (x*y' + x'*y) (y*y')
-    (x:%y) * (x':%y')   =  reduce (x * x') (y * y')
-    negate (x:%y)       =  (-x) :% y
-    abs (x:%y)          =  abs x :% y
-    signum (x:%y)       =  signum x :% 1
-    fromInteger x       =  fromInteger x :% 1
-
-instance  (Integral a)  => Real (Ratio a)  where
-    toRational (x:%y)   =  toInteger x :% toInteger y
-
-instance  (Integral a)  => Fractional (Ratio a)  where
-    (x:%y) / (x':%y')   =  (x*y') % (y*x')
-    recip (x:%y)        =  y % x
-    fromRational (x:%y) =  fromInteger x :% fromInteger y
-
-instance  (Integral a)  => RealFrac (Ratio a)  where
-    properFraction (x:%y) = (fromIntegral q, r:%y)
-                            where (q,r) = quotRem x y
-
-instance  (Integral a)  => Enum (Ratio a)  where
-    succ x           =  x+1
-    pred x           =  x-1
-    toEnum           =  fromIntegral
-    fromEnum         =  fromInteger . truncate -- May overflow
-    enumFrom         =  numericEnumFrom                -- These numericEnumXXX functions
-    enumFromThen     =  numericEnumFromThen    -- are as defined in Prelude.hs
-    enumFromTo       =  numericEnumFromTo      -- but not exported from it!
-    enumFromThenTo   =  numericEnumFromThenTo
-
-instance  (Read a, Integral a)  => Read (Ratio a)  where
-    readsPrec p  =  readParen (p > ratPrec)
-                              (\r -> [(x%y,u) | (x,s)   <- readsPrec (ratPrec+1) r,
-                                                ("%",t) <- lex s,
-                                                (y,u)   <- readsPrec (ratPrec+1) t ])
-
-instance  (Integral a)  => Show (Ratio a)  where
-    showsPrec p (x:%y)  =  showParen (p > ratPrec)
-                               (showsPrec (ratPrec+1) x . 
-                               showString " % " . 
-                               showsPrec (ratPrec+1) y)
-
-
-
-approxRational x eps    =  simplest (x-eps) (x+eps)
-        where simplest x y | y < x      =  simplest y x
-                           | x == y     =  xr
-                           | x > 0      =  simplest' n d n' d'
-                           | y < 0      =  - simplest' (-n') d' (-n) d
-                           | otherwise  =  0 :% 1
-                                        where xr@(n:%d) = toRational x
-                                              (n':%d')  = toRational y
-
-              simplest' n d n' d'       -- assumes 0 < n%d < n'%d'
-                        | r == 0     =  q :% 1
-                        | q /= q'    =  (q+1) :% 1
-                        | otherwise  =  (q*n''+d'') :% n''
-                                     where (q,r)      =  quotRem n d
-                                           (q',r')    =  quotRem n' d'
-                                           (n'':%d'') =  simplest' d' r' d r
diff --git a/report/lib-code/Time.hs b/report/lib-code/Time.hs
deleted file mode 100644 (file)
index 073d727..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-module Time (
-        ClockTime, 
-        Month(January,February,March,April,May,June,
-              July,August,September,October,November,December),
-        Day(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday),
-       CalendarTime(CalendarTime, ctYear, ctMonth, ctDay, ctHour, ctMin,
-                    ctSec, ctPicosec, ctWDay, ctYDay, 
-                     ctTZName, ctTZ, ctIsDST),
-       TimeDiff(TimeDiff, tdYear, tdMonth, tdDay, 
-                tdHour, tdMin, tdSec, tdPicosec),
-        getClockTime, addToClockTime, diffClockTimes,
-        toCalendarTime, toUTCTime, toClockTime,
-        calendarTimeToString, formatCalendarTime ) where
-
-import Ix(Ix)
-import Locale(TimeLocale(..),defaultTimeLocale)
-import Char ( intToDigit )
-
-data ClockTime = ...                    -- Implementation-dependent
-instance Ord  ClockTime where ...
-instance Eq   ClockTime where ...
-
-data Month =  January   | February | March    | April
-           |  May       | June     | July     | August
-           |  September | October  | November | December
-           deriving (Eq, Ord, Enum, Bounded, Ix, Read, Show)
-
-data Day   =  Sunday | Monday  | Tuesday  | Wednesday | Thursday 
-           |  Friday | Saturday
-           deriving (Eq, Ord, Enum, Bounded, Ix, Read, Show)
-
-data CalendarTime = CalendarTime {
-                ctYear                          :: Int,
-                ctMonth                         :: Month,
-                ctDay, ctHour, ctMin, ctSec     :: Int,
-                ctPicosec                       :: Integer,
-                ctWDay                          :: Day,
-                ctYDay                          :: Int,
-                ctTZName                        :: String,
-                ctTZ                            :: Int,
-                ctIsDST                         :: Bool
-        } deriving (Eq, Ord, Read, Show)
-
-data TimeDiff = TimeDiff {
-                tdYear, tdMonth, tdDay, tdHour, tdMin, tdSec :: Int,
-                tdPicosec                                    :: Integer
-        } deriving (Eq, Ord, Read, Show)
-
-
-getClockTime            :: IO ClockTime
-getClockTime            = ...           -- Implementation-dependent
-
-addToClockTime          :: TimeDiff     -> ClockTime -> ClockTime
-addToClockTime td ct    =  ...          -- Implementation-dependent
-
-diffClockTimes          :: ClockTime    -> ClockTime -> TimeDiff
-diffClockTimes ct1 ct2  =  ...          -- Implementation-dependent
-
-toCalendarTime          :: ClockTime    -> IO CalendarTime
-toCalendarTime ct       =  ...          -- Implementation-dependent
-
-toUTCTime               :: ClockTime    -> CalendarTime
-toUTCTime ct            =  ...          -- Implementation-dependent
-
-toClockTime             :: CalendarTime -> ClockTime
-toClockTime cal         =  ...          -- Implementation-dependent
-
-calendarTimeToString    :: CalendarTime -> String
-calendarTimeToString    =  formatCalendarTime defaultTimeLocale "%c"
-
-formatCalendarTime :: TimeLocale -> String -> CalendarTime -> String
-formatCalendarTime l fmt ct@(CalendarTime year mon day hour min sec sdec 
-                                           wday yday tzname _ _) =
-        doFmt fmt
-  where doFmt ('%':c:cs) = decode c ++ doFmt cs
-        doFmt (c:cs) = c : doFmt cs
-        doFmt "" = ""
-
-        to12 :: Int -> Int
-        to12 h = let h' = h `mod` 12 in if h' == 0 then 12 else h'
-
-        decode 'A' = fst (wDays l  !! fromEnum wday)
-        decode 'a' = snd (wDays l  !! fromEnum wday)
-        decode 'B' = fst (months l !! fromEnum mon)
-        decode 'b' = snd (months l !! fromEnum mon)
-        decode 'h' = snd (months l !! fromEnum mon)
-        decode 'C' = show2 (year `quot` 100)
-        decode 'c' = doFmt (dateTimeFmt l)
-        decode 'D' = doFmt "%m/%d/%y"
-        decode 'd' = show2 day
-        decode 'e' = show2' day
-        decode 'H' = show2 hour
-        decode 'I' = show2 (to12 hour)
-        decode 'j' = show3 yday
-        decode 'k' = show2' hour
-        decode 'l' = show2' (to12 hour)
-        decode 'M' = show2 min
-        decode 'm' = show2 (fromEnum mon+1)
-        decode 'n' = "\n"
-        decode 'p' = (if hour < 12 then fst else snd) (amPm l)
-        decode 'R' = doFmt "%H:%M"
-        decode 'r' = doFmt (time12Fmt l)
-        decode 'T' = doFmt "%H:%M:%S"
-        decode 't' = "\t"
-        decode 'S' = show2 sec
-        decode 's' = ...                -- Implementation-dependent
-        decode 'U' = show2 ((yday + 7 - fromEnum wday) `div` 7)
-        decode 'u' = show (let n = fromEnum wday in 
-                           if n == 0 then 7 else n)
-        decode 'V' = 
-            let (week, days) = 
-                   (yday + 7 - if fromEnum wday > 0 then 
-                               fromEnum wday - 1 else 6) `divMod` 7
-            in  show2 (if days >= 4 then
-                          week+1 
-                       else if week == 0 then 53 else week)
-
-        decode 'W' = 
-            show2 ((yday + 7 - if fromEnum wday > 0 then 
-                               fromEnum wday - 1 else 6) `div` 7)
-        decode 'w' = show (fromEnum wday)
-        decode 'X' = doFmt (timeFmt l)
-        decode 'x' = doFmt (dateFmt l)
-        decode 'Y' = show year
-        decode 'y' = show2 (year `rem` 100)
-        decode 'Z' = tzname
-        decode '%' = "%"
-        decode c   = [c]
-
-show2, show2', show3 :: Int -> String
-show2 x = [intToDigit (x `quot` 10), intToDigit (x `rem` 10)]
-
-show2' x = if x < 10 then [ ' ', intToDigit x] else show2 x
-
-show3 x = intToDigit (x `quot` 100) : show2 (x `rem` 100)
-
diff --git a/report/lib-hdrs/Array.hs b/report/lib-hdrs/Array.hs
deleted file mode 100644 (file)
index 2bb99d0..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-module  Array ( 
-        module Ix,  -- export all of Ix for convenience
-        Array, array, listArray, (!), bounds, indices, elems, assocs, 
-        accumArray, (//), accum, ixmap ) where
-
-import Ix
-
-infixl 9  !, //
-
-data  (Ix a)    => Array a b = ...     -- Abstract
-
-array           :: (Ix a) => (a,a) -> [(a,b)] -> Array a b
-listArray       :: (Ix a) => (a,a) -> [b] -> Array a b
-(!)             :: (Ix a) => Array a b -> a -> b
-bounds          :: (Ix a) => Array a b -> (a,a)
-indices         :: (Ix a) => Array a b -> [a]
-elems           :: (Ix a) => Array a b -> [b]
-assocs          :: (Ix a) => Array a b -> [(a,b)]
-accumArray      :: (Ix a) => (b -> c -> b) -> b -> (a,a) -> [(a,c)]
-                             -> Array a b
-(//)            :: (Ix a) => Array a b -> [(a,b)] -> Array a b
-accum           :: (Ix a) => (b -> c -> b) -> Array a b -> [(a,c)]
-                             -> Array a b
-ixmap           :: (Ix a, Ix b) => (a,a) -> (a -> b) -> Array b c
-                             -> Array a c
-
-instance                            Functor (Array a) where ...
-instance  (Ix a, Eq b)           => Eq   (Array a b)  where ...
-instance  (Ix a, Ord b)          => Ord  (Array a b)  where ...
-instance  (Ix a, Show a, Show b) => Show (Array a b)  where ...
-instance  (Ix a, Read a, Read b) => Read (Array a b)  where ...
-
diff --git a/report/lib-hdrs/CPUTime.hs b/report/lib-hdrs/CPUTime.hs
deleted file mode 100644 (file)
index f03437a..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-module CPUTime ( getCPUTime, cpuTimePrecision ) where
-
-getCPUTime        :: IO Integer
-cpuTimePrecision  :: Integer
diff --git a/report/lib-hdrs/Char.hs b/report/lib-hdrs/Char.hs
deleted file mode 100644 (file)
index 3722821..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-module Char ( 
-    isAscii, isLatin1, isControl, isPrint, isSpace, isUpper, isLower, 
-    isAlpha, isDigit, isOctDigit, isHexDigit, isAlphaNum, 
-    digitToInt, intToDigit,
-    toUpper, toLower,
-    ord, chr,
-    readLitChar, showLitChar, lexLitChar,
-
-       -- ...and what the Prelude exports
-    Char, String
-    ) where
-
-isAscii, isLatin1, isControl, isPrint, isSpace, isUpper, isLower, 
- isAlpha, isDigit, isOctDigit, isHexDigit, isAlphaNum :: Char -> Bool
-
-toUpper, toLower        :: Char -> Char
-
-digitToInt :: Char -> Int
-intToDigit :: Int -> Char
-
-ord        :: Char -> Int
-chr        :: Int  -> Char
-
-lexLitChar  :: ReadS String
-readLitChar :: ReadS Char
-showLitChar :: Char -> ShowS
diff --git a/report/lib-hdrs/Complex.hs b/report/lib-hdrs/Complex.hs
deleted file mode 100644 (file)
index d78b78a..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-module  Complex ( 
-    Complex((:+)), realPart, imagPart, conjugate, 
-    mkPolar, cis, polar, magnitude, phase ) where
-
-infix  6  :+
-
-data  (RealFloat a)     => Complex a = !a :+ !a
-
-realPart, imagPart      :: (RealFloat a) => Complex a -> a
-conjugate              :: (RealFloat a) => Complex a -> Complex a
-mkPolar                        :: (RealFloat a) => a -> a -> Complex a
-cis                    :: (RealFloat a) => a -> Complex a
-polar                  :: (RealFloat a) => Complex a -> (a,a)
-magnitude, phase        :: (RealFloat a) => Complex a -> a
-
-instance  (RealFloat a) => Eq         (Complex a)  where ...
-instance  (RealFloat a) => Read       (Complex a)  where ...
-instance  (RealFloat a) => Show       (Complex a)  where ...
-instance  (RealFloat a) => Num        (Complex a)  where ...
-instance  (RealFloat a) => Fractional (Complex a)  where ...
-instance  (RealFloat a) => Floating   (Complex a)  where ...
diff --git a/report/lib-hdrs/Directory.hs b/report/lib-hdrs/Directory.hs
deleted file mode 100644 (file)
index 21245cf..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-module Directory ( 
-    Permissions( Permissions, readable, writable, 
-                              executable, searchable ), 
-    createDirectory, removeDirectory, removeFile, 
-    renameDirectory, renameFile, getDirectoryContents,
-    getCurrentDirectory, setCurrentDirectory,
-    doesFileExist, doesDirectoryExist,
-    getPermissions, setPermissions,
-    getModificationTime ) where
-
-import Time ( ClockTime )
-
-data Permissions = Permissions {
-                       readable,   writable,
-                       executable, searchable :: Bool
-                  }
-
-instance Eq   Permissions where ...
-instance Ord  Permissions where ...
-instance Read Permissions where ...
-instance Show Permissions where ...
-
-
-
-createDirectory        :: FilePath -> IO ()
-removeDirectory        :: FilePath -> IO ()
-removeFile             :: FilePath -> IO ()
-renameDirectory        :: FilePath -> FilePath -> IO ()
-renameFile             :: FilePath -> FilePath -> IO ()
-
-getDirectoryContents   :: FilePath -> IO [FilePath]
-getCurrentDirectory    :: IO FilePath
-setCurrentDirectory    :: FilePath -> IO ()
-
-doesFileExist          :: FilePath -> IO Bool
-doesDirectoryExist     :: FilePath -> IO Bool
-
-getPermissions         :: FilePath -> IO Permissions
-setPermissions         :: FilePath -> Permissions -> IO ()
-
-getModificationTime    :: FilePath -> IO ClockTime
-
diff --git a/report/lib-hdrs/IO.hs b/report/lib-hdrs/IO.hs
deleted file mode 100644 (file)
index 5b72396..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-module IO (
-    Handle, HandlePosn,
-    IOMode(ReadMode,WriteMode,AppendMode,ReadWriteMode),
-    BufferMode(NoBuffering,LineBuffering,BlockBuffering),
-    SeekMode(AbsoluteSeek,RelativeSeek,SeekFromEnd),
-    stdin, stdout, stderr, 
-    openFile, hClose, hFileSize, hIsEOF, isEOF,
-    hSetBuffering, hGetBuffering, hFlush, 
-    hGetPosn, hSetPosn, hSeek, 
-    hWaitForInput, hReady, hGetChar, hGetLine, hLookAhead, 
-    hGetContents, hPutChar, hPutStr, hPutStrLn, hPrint,
-    hIsOpen, hIsClosed, hIsReadable, hIsWritable, hIsSeekable,
-    isAlreadyExistsError, isDoesNotExistError, isAlreadyInUseError, 
-    isFullError, isEOFError,
-    isIllegalOperation, isPermissionError, isUserError, 
-    ioeGetErrorString, ioeGetHandle, ioeGetFileName,
-    try, bracket, bracket_,
-
-    -- ...and what the Prelude exports
-    IO, FilePath, IOError, ioError, userError, catch, interact,
-    putChar, putStr, putStrLn, print, getChar, getLine, getContents,
-    readFile, writeFile, appendFile, readIO, readLn
-    ) where
-
-import Ix(Ix)
-
-data Handle = ...                      -- implementation-dependent
-instance Eq Handle where ...
-instance Show Handle where ..           -- implementation-dependent
-
-data HandlePosn = ...                  -- implementation-dependent
-instance Eq HandlePosn where ...
-instance Show HandlePosn where ---      -- implementation-dependent
-
-
-data IOMode      =  ReadMode | WriteMode | AppendMode | ReadWriteMode
-                    deriving (Eq, Ord, Ix, Bounded, Enum, Read, Show)
-data BufferMode  =  NoBuffering | LineBuffering 
-                 |  BlockBuffering (Maybe Int)
-                    deriving (Eq, Ord, Read, Show)
-data SeekMode    =  AbsoluteSeek | RelativeSeek | SeekFromEnd
-                    deriving (Eq, Ord, Ix, Bounded, Enum, Read, Show)
-
-stdin, stdout, stderr :: Handle
-
-openFile              :: FilePath -> IOMode -> IO Handle
-hClose                :: Handle -> IO ()
diff --git a/report/lib-hdrs/IO1.hs b/report/lib-hdrs/IO1.hs
deleted file mode 100644 (file)
index 413affd..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-hFileSize             :: Handle -> IO Integer
-hIsEOF                :: Handle -> IO Bool
-isEOF                 :: IO Bool
-isEOF                 =  hIsEOF stdin
-
-hSetBuffering         :: Handle  -> BufferMode -> IO ()
-hGetBuffering         :: Handle  -> IO BufferMode
-hFlush                :: Handle -> IO () 
-hGetPosn              :: Handle -> IO HandlePosn
-hSetPosn              :: HandlePosn -> IO () 
-hSeek                 :: Handle -> SeekMode -> Integer -> IO () 
-
-hWaitForInput        :: Handle -> Int -> IO Bool
-hReady                :: Handle -> IO Bool 
-hReady h             =  hWaitForInput h 0
-hGetChar              :: Handle -> IO Char
-hGetLine              :: Handle -> IO String
-hLookAhead            :: Handle -> IO Char
-hGetContents          :: Handle -> IO String
-hPutChar              :: Handle -> Char -> IO ()
-hPutStr               :: Handle -> String -> IO ()
-hPutStrLn             :: Handle -> String -> IO ()
-hPrint                :: Show a => Handle -> a -> IO ()
-
-hIsOpen               :: Handle -> IO Bool
-hIsClosed             :: Handle -> IO Bool
-hIsReadable           :: Handle -> IO Bool
-hIsWritable           :: Handle -> IO Bool
-hIsSeekable           :: Handle -> IO Bool
-
-isAlreadyExistsError  :: IOError -> Bool
-isDoesNotExistError   :: IOError -> Bool
-isAlreadyInUseError   :: IOError -> Bool
-isFullError           :: IOError -> Bool
-isEOFError            :: IOError -> Bool
-isIllegalOperation    :: IOError -> Bool
-isPermissionError     :: IOError -> Bool
-isUserError           :: IOError -> Bool
-
-ioeGetErrorString     :: IOError -> String
-ioeGetHandle          :: IOError -> Maybe Handle
-ioeGetFileName        :: IOError -> Maybe FilePath
-
-try                   :: IO a -> IO (Either IOError a)
-bracket               :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c
-bracket_              :: IO a -> (a -> IO b) -> IO c -> IO c
diff --git a/report/lib-hdrs/Ix.hs b/report/lib-hdrs/Ix.hs
deleted file mode 100644 (file)
index ac5199d..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-module Ix ( Ix(range, index, inRange, rangeSize) ) where
-
-class  Ord a => Ix a  where
-    range       :: (a,a) -> [a]
-    index       :: (a,a) -> a -> Int
-    inRange     :: (a,a) -> a -> Bool
-    rangeSize   :: (a,a) -> Int
-
-instance                   Ix Char      where ...
-instance                   Ix Int       where ...
-instance                   Ix Integer   where ...
-instance  (Ix a, Ix b)  => Ix (a,b)     where ...
--- et cetera
-instance                   Ix Bool      where ...
-instance                   Ix Ordering  where ...
diff --git a/report/lib-hdrs/List.hs b/report/lib-hdrs/List.hs
deleted file mode 100644 (file)
index df18dd3..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-module List ( 
-    elemIndex, elemIndices,
-    find, findIndex, findIndices,
-    nub, nubBy, delete, deleteBy, (\\), deleteFirstsBy,
-    union, unionBy, intersect, intersectBy,
-    intersperse, transpose, partition, group, groupBy,
-    inits, tails, isPrefixOf, isSuffixOf,
-    mapAccumL, mapAccumR,
-    sort, sortBy, insert, insertBy, maximumBy, minimumBy,
-    genericLength, genericTake, genericDrop,
-    genericSplitAt, genericIndex, genericReplicate,
-    zip4, zip5, zip6, zip7,
-    zipWith4, zipWith5, zipWith6, zipWith7,
-    unzip4, unzip5, unzip6, unzip7, unfoldr,
-
-    -- ...and what the Prelude exports
-    -- []((:), []),    -- This is built-in syntax
-    map, (++), concat, filter,
-    head, last, tail, init, null, length, (!!),
-    foldl, foldl1, scanl, scanl1, foldr, foldr1, scanr, scanr1,
-    iterate, repeat, replicate, cycle,
-    take, drop, splitAt, takeWhile, dropWhile, span, break,
-    lines, words, unlines, unwords, reverse, and, or,
-    any, all, elem, notElem, lookup,
-    sum, product, maximum, minimum, concatMap, 
-    zip, zip3, zipWith, zipWith3, unzip, unzip3
-    ) where
-
-infix 5 \\
-
-elemIndex           :: Eq a => a -> [a] -> Maybe Int
-elemIndices         :: Eq a => a -> [a] -> [Int]
-find                :: (a -> Bool) -> [a] -> Maybe a
-findIndex           :: (a -> Bool) -> [a] -> Maybe Int
-findIndices         :: (a -> Bool) -> [a] -> [Int]
-nub                 :: Eq a => [a] -> [a]
-nubBy               :: (a -> a -> Bool) -> [a] -> [a]
-delete              :: Eq a => a -> [a] -> [a]
-deleteBy            :: (a -> a -> Bool) -> a -> [a] -> [a]
-(\\)                :: Eq a => [a] -> [a] -> [a]
-deleteFirstsBy      :: (a -> a -> Bool) -> [a] -> [a] -> [a]
-union               :: Eq a => [a] -> [a] -> [a]
-unionBy             :: (a -> a -> Bool) -> [a] -> [a] -> [a]
-
diff --git a/report/lib-hdrs/List1.hs b/report/lib-hdrs/List1.hs
deleted file mode 100644 (file)
index 897d28f..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-intersect        :: Eq a => [a] -> [a] -> [a]
-intersectBy      :: (a -> a -> Bool) -> [a] -> [a] -> [a]
-intersperse      :: a -> [a] -> [a]
-transpose        :: [[a]] -> [[a]]
-partition        :: (a -> Bool) -> [a] -> ([a],[a])
-group            :: Eq a => [a] -> [[a]]
-groupBy          :: (a -> a -> Bool) -> [a] -> [[a]]
-inits            :: [a] -> [[a]] 
-tails            :: [a] -> [[a]] 
-isPrefixOf       :: Eq a => [a] -> [a] -> Bool
-isSuffixOf       :: Eq a => [a] -> [a] -> Bool
-mapAccumL        :: (a -> b -> (a, c)) -> a -> [b] -> (a, [c])
-mapAccumR        :: (a -> b -> (a, c)) -> a -> [b] -> (a, [c])
-unfoldr                 :: (b -> Maybe (a,b)) -> b -> [a]
-sort             :: Ord a => [a] -> [a]
-sortBy           :: (a -> a -> Ordering) -> [a] -> [a]
-insert          :: Ord a => a -> [a] -> [a]
-insertBy         :: (a -> a -> Ordering) -> a -> [a] -> [a]
-maximumBy        :: (a -> a -> Ordering) -> [a] -> a
-minimumBy        :: (a -> a -> Ordering) -> [a] -> a
-genericLength    :: Integral a => [b] -> a
-genericTake     :: Integral a => a -> [b] -> [b]
-genericDrop     :: Integral a => a -> [b] -> [b]
-genericSplitAt  :: Integral a => a -> [b] -> ([b],[b])
-genericIndex    :: Integral a => [b] -> a -> b
-genericReplicate :: Integral a => a -> b -> [b]
-
-zip4             :: [a] -> [b] -> [c] -> [d] -> [(a,b,c,d)]
-zip5             :: [a] -> [b] -> [c] -> [d] -> [e] -> [(a,b,c,d,e)]
-zip6             :: [a] -> [b] -> [c] -> [d] -> [e] -> [f] 
-                       -> [(a,b,c,d,e,f)]
-zip7             :: [a] -> [b] -> [c] -> [d] -> [e] -> [f] -> [g]
-                       -> [(a,b,c,d,e,f,g)]
-zipWith4         :: (a->b->c->d->e) -> [a]->[b]->[c]->[d]->[e]
-zipWith5         :: (a->b->c->d->e->f) -> 
-                    [a]->[b]->[c]->[d]->[e]->[f]
-zipWith6         :: (a->b->c->d->e->f->g) ->
-                    [a]->[b]->[c]->[d]->[e]->[f]->[g]
-zipWith7         :: (a->b->c->d->e->f->g->h) ->
-                    [a]->[b]->[c]->[d]->[e]->[f]->[g]->[h]
-unzip4           :: [(a,b,c,d)] -> ([a],[b],[c],[d])
-unzip5           :: [(a,b,c,d,e)] -> ([a],[b],[c],[d],[e])
-unzip6           :: [(a,b,c,d,e,f)] -> ([a],[b],[c],[d],[e],[f])
-unzip7           :: [(a,b,c,d,e,f,g)] -> ([a],[b],[c],[d],[e],[f],[g])
diff --git a/report/lib-hdrs/Locale.hs b/report/lib-hdrs/Locale.hs
deleted file mode 100644 (file)
index a9a57d1..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-module Locale(TimeLocale(..), defaultTimeLocale) where
-
-data TimeLocale = TimeLocale {
-        wDays  :: [(String, String)],   -- full and abbreviated week days
-        months :: [(String, String)],   -- full and abbreviated months
-        amPm   :: (String, String),     -- AM/PM symbols
-        dateTimeFmt, dateFmt,           -- formatting strings
-          timeFmt, time12Fmt :: String     
-        } deriving (Eq, Ord, Show)
-
-defaultTimeLocale :: TimeLocale 
diff --git a/report/lib-hdrs/Maybe.hs b/report/lib-hdrs/Maybe.hs
deleted file mode 100644 (file)
index e536efa..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-module Maybe(
-    isJust, isNothing,
-    fromJust, fromMaybe, listToMaybe, maybeToList,
-    catMaybes, mapMaybe,
-
-    -- ...and what the Prelude exports
-    Maybe(Nothing, Just),
-    maybe
-  ) where
-
-isJust, isNothing    :: Maybe a -> Bool
-fromJust             :: Maybe a -> a
-fromMaybe            :: a -> Maybe a -> a
-listToMaybe          :: [a] -> Maybe a
-maybeToList          :: Maybe a -> [a]
-catMaybes            :: [Maybe a] -> [a]
-mapMaybe             :: (a -> Maybe b) -> [a] -> [b]
diff --git a/report/lib-hdrs/Monad.hs b/report/lib-hdrs/Monad.hs
deleted file mode 100644 (file)
index 561e29f..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-module Monad (
-    MonadPlus(mzero, mplus),
-    join, guard, when, unless, ap,
-    msum,
-    filterM, mapAndUnzipM, zipWithM, zipWithM_, foldM, 
-    liftM, liftM2, liftM3, liftM4, liftM5,
-
-    -- ...and what the Prelude exports
-    Monad((>>=), (>>), return, fail),
-    Functor(fmap),
-    mapM, mapM_, sequence, sequence_, (=<<), 
-    ) where
-
-class  Monad m => MonadPlus m  where
-    mzero  :: m a
-    mplus  :: m a -> m a -> m a
-
-join             :: Monad m => m (m a) -> m a
-guard            :: MonadPlus m => Bool -> m ()
-when             :: Monad m => Bool -> m () -> m ()
-unless           :: Monad m => Bool -> m () -> m ()
-ap              :: Monad m => m (a -> b) -> m a -> m b
-
-mapAndUnzipM     :: Monad m => (a -> m (b,c)) -> [a] -> m ([b], [c])
-zipWithM         :: Monad m => (a -> b -> m c) -> [a] -> [b] -> m [c]
-zipWithM_        :: Monad m => (a -> b -> m c) -> [a] -> [b] -> m ()
-foldM            :: Monad m => (a -> b -> m a) -> a -> [b] -> m a
-filterM                 :: Monad m => (a -> m Bool) -> [a] -> m [a]
-
-msum            :: MonadPlus m => [m a] -> m a
-
-liftM            :: Monad m => (a -> b) -> (m a -> m b)
-liftM2           :: Monad m => (a -> b -> c) -> (m a -> m b -> m c)
-liftM3           :: Monad m => (a -> b -> c -> d) ->
-                               (m a -> m b -> m c -> m d)
-liftM4           :: Monad m => (a -> b -> c -> d -> e) ->
-                               (m a -> m b -> m c -> m d -> m e)
-liftM5           :: Monad m => (a -> b -> c -> d -> e -> f) ->
-                               (m a -> m b -> m c -> m d -> m e -> m f)
-
diff --git a/report/lib-hdrs/Numeric.hs b/report/lib-hdrs/Numeric.hs
deleted file mode 100644 (file)
index 04e6710..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-module Numeric(fromRat,
-               showSigned, showIntAtBase,
-               showInt, showOct, showHex,
-               readSigned, readInt,
-               readDec, readOct, readHex, 
-               floatToDigits,
-               showEFloat, showFFloat, showGFloat, showFloat, 
-               readFloat, lexDigits) where
-
-fromRat        :: (RealFloat a) => Rational -> a
-
-showSigned     :: (Real a) => (a -> ShowS) -> Int -> a -> ShowS
-showIntAtBase  :: Integral a => a -> (Int -> Char) -> a -> ShowS
-showInt        :: Integral a => a -> ShowS
-showOct        :: Integral a => a -> ShowS
-showHex        :: Integral a => a -> ShowS
-
-readSigned     :: (Real a) => ReadS a -> ReadS a
-readInt        :: (Integral a) =>
-                    a -> (Char -> Bool) -> (Char -> Int) -> ReadS a
-readDec        :: (Integral a) => ReadS a
-readOct        :: (Integral a) => ReadS a
-readHex        :: (Integral a) => ReadS a
-
-showEFloat     :: (RealFloat a) => Maybe Int -> a -> ShowS
-showFFloat     :: (RealFloat a) => Maybe Int -> a -> ShowS
-showGFloat     :: (RealFloat a) => Maybe Int -> a -> ShowS
-showFloat      :: (RealFloat a) => a -> ShowS
-
-floatToDigits  :: (RealFloat a) => Integer -> a -> ([Int], Int)
-
-readFloat      :: (RealFrac a) => ReadS a
-lexDigits      :: ReadS String 
diff --git a/report/lib-hdrs/Random.hs b/report/lib-hdrs/Random.hs
deleted file mode 100644 (file)
index 76f587a..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-module Random (
-       RandomGen(next, split, genRange),
-       StdGen, mkStdGen,
-       Random( random,   randomR, 
-               randoms,  randomRs,
-               randomIO, randomRIO ),
-       getStdRandom, getStdGen, setStdGen, newStdGen
-  ) where
-       
----------------- The RandomGen class ------------------------
-
-class RandomGen g where
-  genRange :: g -> (Int, Int)
-  next     :: g -> (Int, g)
-  split    :: g -> (g, g)
-
----------------- A standard instance of RandomGen -----------
-data StdGen = ...      -- Abstract
-
-instance RandomGen StdGen where ...
-instance Read     StdGen where ...
-instance Show     StdGen where ...
-
-mkStdGen :: Int -> StdGen
-
----------------- The Random class ---------------------------
-class Random a where
-   randomR :: RandomGen g => (a, a) -> g -> (a, g)
-   random  :: RandomGen g => g -> (a, g)
-
-   randomRs :: RandomGen g => (a, a) -> g -> [a]
-   randoms  :: RandomGen g => g -> [a]
-
-   randomRIO :: (a,a) -> IO a
-   randomIO  :: IO a
-
-instance Random Int     where ...
-instance Random Integer where ...
-instance Random Float   where ...
-instance Random Double  where ...
-instance Random Bool    where ...
-instance Random Char    where ...
-
----------------- The global random generator ----------------
-newStdGen    :: IO StdGen
-setStdGen    :: StdGen -> IO ()
-getStdGen    :: IO StdGen      
-getStdRandom :: (StdGen -> (a, StdGen)) -> IO a
-
-
diff --git a/report/lib-hdrs/Ratio.hs b/report/lib-hdrs/Ratio.hs
deleted file mode 100644 (file)
index 13755cf..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-module Ratio (
-    Ratio, Rational, (%), numerator, denominator, approxRational ) where
-
-infixl 7  %
-data  (Integral a)     => Ratio a = ...
-type  Rational         =  Ratio Integer
-(%)                    :: (Integral a) => a -> a -> Ratio a
-numerator, denominator :: (Integral a) => Ratio a -> a
-approxRational         :: (RealFrac a) => a -> a -> Rational
-instance  (Integral a)  => Eq         (Ratio a)  where ...
-instance  (Integral a) => Ord        (Ratio a)  where ...
-instance  (Integral a) => Num        (Ratio a)  where ...
-instance  (Integral a) => Real       (Ratio a)  where ...
-instance  (Integral a) => Fractional (Ratio a)  where ...
-instance  (Integral a) => RealFrac   (Ratio a)  where ...
-instance  (Integral a) => Enum       (Ratio a)  where ...
-instance  (Read a,Integral a) => Read (Ratio a)  where ...
-instance  (Integral a)  => Show       (Ratio a)  where ...
-
diff --git a/report/lib-hdrs/System.hs b/report/lib-hdrs/System.hs
deleted file mode 100644 (file)
index e534519..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-module System ( 
-    ExitCode(ExitSuccess,ExitFailure),
-    getArgs, getProgName, getEnv, system, exitWith, exitFailure
-  ) where
-
-data ExitCode = ExitSuccess | ExitFailure Int 
-                deriving (Eq, Ord, Read, Show)
-
-getArgs                :: IO [String]
-getProgName            :: IO String
-getEnv                 :: String -> IO String
-system                 :: String -> IO ExitCode
-exitWith               :: ExitCode -> IO a
-exitFailure            :: IO a
diff --git a/report/lib-hdrs/Time.hs b/report/lib-hdrs/Time.hs
deleted file mode 100644 (file)
index 6f5eddd..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-module Time (
-       ClockTime, 
-       Month(January,February,March,April,May,June,
-             July,August,September,October,November,December),
-       Day(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday),
-       CalendarTime(CalendarTime, ctYear, ctMonth, ctDay, ctHour, ctMin,
-                    ctSec, ctPicosec, ctWDay, ctYDay, 
-                     ctTZName, ctTZ, ctIsDST),
-       TimeDiff(TimeDiff, tdYear, tdMonth, tdDay, tdHour,
-                tdMin, tdSec, tdPicosec),
-       getClockTime, addToClockTime, diffClockTimes,
-        toCalendarTime, toUTCTime, toClockTime,
-        calendarTimeToString, formatCalendarTime ) where
-
-import Ix(Ix)
-
-data ClockTime = ...                   -- Implementation-dependent
-instance Ord  ClockTime where ...
-instance Eq   ClockTime where ...
-
-data Month =  January   | February | March    | April
-           |  May       | June     | July     | August
-           |  September | October  | November | December
-           deriving (Eq, Ord, Enum, Bounded, Ix, Read, Show)
-
-data Day   =  Sunday | Monday  | Tuesday  | Wednesday | Thursday 
-           |  Friday | Saturday
-           deriving (Eq, Ord, Enum, Bounded, Ix, Read, Show)
-
-data CalendarTime = CalendarTime {
-               ctYear                          :: Int,
-               ctMonth                         :: Month,
-               ctDay, ctHour, ctMin, ctSec     :: Int,
-               ctPicosec                       :: Integer,
-               ctWDay                          :: Day,
-               ctYDay                          :: Int,
-               ctTZName                        :: String,
-               ctTZ                            :: Int,
-               ctIsDST                         :: Bool
-       } deriving (Eq, Ord, Read, Show)
-
-data TimeDiff = TimeDiff {
-               tdYear, tdMonth, tdDay, tdHour, tdMin, tdSec :: Int,
-               tdPicosec                                    :: Integer
-       } deriving (Eq, Ord, Read, Show)
diff --git a/report/lib-hdrs/Time1.hs b/report/lib-hdrs/Time1.hs
deleted file mode 100644 (file)
index 1ce79d5..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
--- Functions on times
-getClockTime         :: IO ClockTime
-                    
-addToClockTime       :: TimeDiff  -> ClockTime -> ClockTime
-diffClockTimes       :: ClockTime -> ClockTime -> TimeDiff
-                    
-toCalendarTime       :: ClockTime    -> IO CalendarTime
-toUTCTime            :: ClockTime    -> CalendarTime
-toClockTime          :: CalendarTime -> ClockTime
-calendarTimeToString :: CalendarTime -> String
-formatCalendarTime   :: TimeLocale -> String -> CalendarTime -> String
diff --git a/report/list.verb b/report/list.verb
deleted file mode 100644 (file)
index a790c42..0000000
+++ /dev/null
@@ -1,273 +0,0 @@
-%**<title>The Haskell 98 Library Report: List Utilities</title>
-%**~header
-\section{List Utilities}
-
-\outline{
-\inputHS{lib-hdrs/List}
-}
-\outline{
-\inputHS{lib-hdrs/List1}
-}
-
-This library defines some lesser-used operations over lists.
-
-\subsection{Indexing lists}
-
-\begin{itemize}
-\item @elemIndex val list@\indextt{elemIndex} returns the index of
-the first occurrence, if any, of @val@  
-in @list@ as @Just index@.  @Nothing@ is returned if @not (val `elem` list)@.
-
-\item @elemIndices val list@\indextt{elemIndices} returns an
-in-order list of indices, giving the occurrences of @val@ in @list@.
-
-\item  @find@\indextt{find} 
-returns the first element of a list that satisfies a predicate,
-or Nothing, if there is no such element.
-@findIndex@ returns the corresponding index.
-@findIndices@ returns a list of all such indices.
-\end{itemize}
-
-\subsection{``Set'' operations}
-
-There are a number of ``set'' operations defined over the @List@ type.
-@nub@ (meaning ``essence'') removes duplicates elements from a list.
-@delete@, @(\\)@, @union@ and @intersect@ (and their @By@ variants) 
-preserve the invariant that their result
-does not contain duplicates, provided that their first argument
-contains no duplicates.
-
-\begin{itemize}
-\item 
-@nub@\indextt{nub} removes duplicate elements from a list. For example:
-\bprog
-@
-  nub [1,3,1,4,3,3] = [1,3,4]
-@
-\eprog
-\item
-@delete x@\indextt{delete} 
-removes the first occurrence of @x@ from its list argument,
-e.g.,  
-\bprog
-@
-  delete 'a' "banana" == "bnana"
-@
-\eprog
-
-\item
-@(\\)@\index{\\\\@@{\tt  {\char'134}{\char'134}}} is list
-difference (non-associative).  In the result of @xs \\ ys@,
-the first occurrence of each element of @ys@ in turn (if any)
-has been removed from @xs@.  Thus, @(xs ++ ys) \\ xs == ys@.
-
-\item 
-@union@\indextt{union} is list union, e.g., 
-\bprog
-@
-  "dog" `union` "cow" == "dogcw"
-@
-\eprog
-
-\item
-@intersect@\indextt{intersect} is list intersection, e.g.,  
-\bprog
-@
-  [1,2,3,4] `intersect` [2,4,6,8] == [2,4]
-@
-\eprog
-\end{itemize}
-
-\subsection{List transformations}
-
-\begin{itemize}
-\item
-@intersperse sep@\indextt{intersperse} 
-inserts @sep@ between the elements of its list argument,
-e.g.,  
-\bprog
-@
-  intersperse ',' "abcde" == "a,b,c,d,e"
-@
-\eprog
-
-\item
-@transpose@\indextt{transpose} transposes the rows and columns of its argument,
-e.g., 
-\bprog
-@
-  transpose [[1,2,3],[4,5,6]] == [[1,4],[2,5],[3,6]]
-@
-\eprog
-
-\item
-@partition@\indextt{partition} 
-takes a predicate and a list and returns a pair of lists:
-those elements of the argument list that do and do not satisfy the
-predicate, respectively; i.e.,
-\bprog
-@
-  partition p xs == (filter p xs, filter (not . p) xs)
-@
-\eprog
-
-\item
-@sort@\indextt{sort}
-implement a stable sorting algorithm, here specified
-in terms of the @insertBy@ function, which inserts objects into a list
-according to the specified ordering relation.
-
-\item
-@insert@\indextt{insert}
-inserts a new element into an {\em ordered} list (arranged in increasing order).
-
-\item
-@group@\indextt{group} splits its list argument into a list of lists of equal, adjacent
-elements. For example
-\bprog
-@
-  group "Mississippi" == ["M","i","ss","i","ss","i","pp","i"]
-@
-\eprog
-
-\item
-@inits@\indextt{inits} returns the list of initial segments of its argument list, shortest first.
-\bprog
-@
-  inits "abc" == ["","a","ab","abc"]
-@
-\eprog
-
-\item
-@tails@\indextt{tails} 
-returns the list of all final segments of its argument list, longest first.
-\bprog
-@
-  tails "abc" == ["abc", "bc", "c",""]
-@
-
-\eprog
-\item
-@mapAccumL f s l@\indextt{mapAccumL} 
-applies @f@ to an accumulating ``state'' parameter @s@
-and to each element of @l@ in turn.
-
-\item
-@mapAccumR@\indextt{mapAccumR}
-is similar to @mapAccumL@ except that the list
-is processed from right-to-left rather than left-to-right.
-\end{itemize}
-
-\subsection{@unfoldr@}
-
-The @unfoldr@ function is a ``dual'' to @foldr@: while @foldr@ reduces a list
-to a summary value, @unfoldr@ builds a list from a seed value.  For 
-example:
-\bprog
-@
-  iterate f == unfoldr (\x -> Just (x, f x))
-@
-\eprog
-In some cases, @unfoldr@ can undo a @foldr@ operation:
-\bprog
-@
-  unfoldr f' (foldr f z xs) == xs
-@
-\eprog
-if the following holds:
-\bprog
-@
-  f' (f x y) = Just (x,y)
-  f' z       = Nothing
-@
-\eprog
-
-\subsection{Predicates}
-
-@isPrefixOf@ and @isSuffixOf@ check whether the first argument is a prefix (resp. suffix)
-of the second argument.
-
-
-\subsection{The ``@By@'' operations}
-
-By convention, overloaded functions have a non-overloaded
-counterpart whose name is suffixed with ``@By@''.  For example, the
-function @nub@ could be defined as follows:
-\bprog
-@
-  nub              :: (Eq a) => [a] -> [a]
-  nub []           =  []
-  nub (x:xs)       =  x : nub (filter (\y -> not (x == y)) xs)
-@
-\eprog
-However, the equality method may not be appropriate in all situations.
-The function:
-\bprog
-@
-  nubBy            :: (a -> a -> Bool) -> [a] -> [a]
-  nubBy eq []      =  []
-  nubBy eq (x:xs)  =  x : nubBy eq (filter (\y -> not (eq x y)) xs)
-@
-\eprog
-allows the programmer to supply their own equality test.
-When the ``@By@'' function replaces an @Eq@ context by a binary predicate,
-the predicate is assumed to define an equivalence; when the ``@By@''
-function replaces an @Ord@ context by a binary predicate, the
-predicate is assumed to define a total ordering.
-
-The ``@By@'' variants are as follows:
-@nubBy@, @deleteBy@, @deleteFirstsBy@ (the "@By@" variant of @\\@),
-@unionBy@, @intersectBy@, @groupBy@,
-@sortBy@, @insertBy@, @maximumBy@, @minimumBy@.  
-\indextt{nubBy} 
-\indextt{deleteBy} 
-\indextt{deleteFirstsBy} 
-\indextt{unionBy} 
-\indextt{intersectBy} 
-\indextt{groupBy} 
-\indextt{sortBy} 
-\indextt{insertBy} 
-\indextt{maximumBy} 
-\indextt{minimumBy} 
-
-The library does not
-provide @elemBy@, because @any (eq x)@ does the same job as @elemBy eq x@ would.
-A handful of overloaded functions (@elemIndex@, @elemIndices@, @isPrefixOf@, @isSuffixOf@)
-were not considered important enough to have ``@By@'' variants.
-
-% Several of the functions defined here are derivatives of, or
-% related to, Prelude functions.  These functions are
-% @elem@, @maximum@, @minimum@, @zip@, @zip3@, @zipWith@,
-% @zipWith3@, @unzip@, @unzip3@, 
-% [according to Keith] @take@, @drop@, @splitAt@, @index@, @replicate@.
-
-\subsection{The ``@generic@'' operations}
-
-The prefix ``@generic@'' indicates an overloaded function that is
-a generalised version of a @Prelude@ function.  For example,
-\bprog
-@
-  genericLength       :: Integral a => [b] -> a
-@ 
-\eprog
-is a generalised version of @length@.
-
-The ``@generic@'' operations are as follows:
-@genericLength@, @genericTake@, @genericDrop@,
-    @genericSplitAt@, @genericIndex@ (the generic version of @!!@), @genericReplicate@.
-
-
-\subsection{Further ``@zip@'' operations}
-
-The Prelude provides @zip@, @zip3@, @unzip@, @unzip3@, @zipWith@, and @zipWith3@.
-The List library provides these same three operations for 4, 5, 6, and 7 arguments.
-\indextt{zip4}
-\indextt{unzip4}
-\indextt{zipWith4}
-
-\clearpage
-\subsection{Library {\tt List}}
-\label{List}
-\inputHS{lib-code/List}
-
-%**~footer
diff --git a/report/locale.verb b/report/locale.verb
deleted file mode 100644 (file)
index fc57962..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-%**<title>The Haskell 98 Library Report: Locale</title>
-%**~header
-\section{Locale}
-\label{locale}
-\index{locale}
-
-\outline {
-\inputHS{lib-hdrs/Locale}
-}
-
-The @Locale@ library provides the ability to adapt to local
-conventions.  At present, it supports only time and date information
-as used by @calendarTimeToString@ from the @Time@ library.
-
-\clearpage
-\subsection{Library {\tt Locale}}
-\inputHS{lib-code/Locale}
-
-%**~footer
diff --git a/report/maybe.verb b/report/maybe.verb
deleted file mode 100644 (file)
index 93bdf8c..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-%**<title>The Haskell 98 Library Report: Maybe Utilities</title>
-%**~header
-\section{Maybe Utilities}
-
-\outline{
-\inputHS{lib-hdrs/Maybe}
-}
-
-The type constructor @Maybe@ is defined in @Prelude@ as
-\bprog
-@
-data Maybe a = Nothing | Just a
-@
-\eprog
-The purpose of the @Maybe@ type is to provide a method of dealing with
-illegal or optional values without terminating the program, as would
-happen if @error@ were used, and without using @IOError@ from the @IO@
-monad, which would cause the expression to become monadic.  A correct
-result is encapsulated by wrapping it in @Just@; an incorrect result
-is returned as @Nothing@.
-
-Other operations on @Maybe@ are provided as part of the monadic
-classes in the Prelude.
-
-\clearpage
-\subsection{Library {\tt Maybe}}
-\label {Maybe}
-\inputHS{lib-code/Maybe}
-
-%**~footer
diff --git a/report/monad.verb b/report/monad.verb
deleted file mode 100644 (file)
index 565065e..0000000
+++ /dev/null
@@ -1,189 +0,0 @@
-%**<title>The Haskell 98 Library Report: Monad Utilities</title>
-%**~header
-\section{Monad Utilities}
-\label{Monad}
-
-\outline{
-\inputHS{lib-hdrs/Monad}
-}
-
-The @Monad@ library defines the @MonadPlus@ class, and 
-provides some useful operations on monads.
-
-\subsection{Naming conventions}
-
-The functions in this library use the following naming conventions:
-\begin{itemize}
-\item
-A postfix ``@M@'' always stands for a function in the Kleisli category:
-@m@ is added to function results (modulo currying) and nowhere else.
-So, for example,
-\bprog
-@
-  filter  ::            (a ->   Bool) -> [a] ->   [a]
-  filterM :: Monad m => (a -> m Bool) -> [a] -> m [a]
-@
-\eprog
-
-\item A postfix ``@_@'' changes the result type from @(m a)@ to @(m ())@.
-Thus (in the @Prelude@):
-\bprog
-@
-sequence  :: Monad m => [m a] -> m [a] 
-sequence_ :: Monad m => [m a] -> m () 
-@
-\eprog
-
-\item A prefix ``@m@'' generalises an existing function to a monadic form.
-Thus, for example:
-\bprog
-@
-  sum  :: Num a       => [a]   -> a
-  msum :: MonadPlus m => [m a] -> m a
-@
-\eprog
-\end{itemize}
-
-\subsection{Class @MonadPlus@}
-
-The @MonadPlus@ class is defined as follows:
-\bprog
-@
-class  Monad m => MonadPlus m  where
-    mzero  :: m a
-    mplus  :: m a -> m a -> m a
-@
-\eprog
-The class methods @mzero@ and @mplus@ are the zero and plus
-of the monad.
-
-Lists and the @Maybe@ type are instances of @MonadPlus@, thus:
-\bprog
-@
-instance  MonadPlus Maybe  where
-    mzero                 = Nothing
-    Nothing `mplus` ys    = ys
-    xs      `mplus` ys    = xs
-
-instance  MonadPlus []  where
-    mzero = []
-    mplus = (++)
-@
-\eprog
-
-
-\subsection{Functions}
-
-The @join@ function is the conventional monad join operator.  It is
-used to remove one level of monadic structure, projecting its bound
-argument into the outer level.
-
-% There is no convincing small-scale example for mapAndUnzipM
-The @mapAndUnzipM@ function maps its first argument over a list,
-returning the result as a pair of lists.  This function is mainly used
-with complicated data structures or a state-transforming monad.
-
-The @zipWithM@ function generalises @zipWith@ to arbitrary monads.
-For instance the following function displays a file, prefixing
-each line with its line number,
-\par
-{\small
-\bprog
-@
-listFile :: String -> IO ()
-listFile nm =
-  do cts <- readFile nm
-     zipWithM_ (\i line -> do putStr (show i); putStr ": "; putStrLn line)
-               [1..]
-               (lines cts)
-@
-\eprog
-}
-The @foldM@ function is analogous to @foldl@, except that its result
-is encapsulated in a monad.  Note that @foldM@ works from
-left-to-right over the list arguments.  This could be an issue where
-@(>>)@ and the ``folded function'' are not commutative. 
-\bprog
-@
-    foldM f a1 [x1, x2, ..., xm ]
-==  
-    do
-      a2 <- f a1 x1
-      a3 <- f a2 x2
-      ...
-      f am xm
-@
-\eprog
-If right-to-left
-evaluation is required, the input list should be reversed.
-
-% Omitted for now.  These functions are very useful in parsing libraries
-% - but in a slightly modified form:
-% o It is conventional to return the _longest_ parse first - not 
-%   shortest first.
-% o The function is too strict - you can't get any part of the result
-%   until the entire parse completes.  The fix is to use the function
-%   force when defining zeroOrMore.
-%   
-%     force :: Parser a -> Parser a
-%     force (P m) = P (\i -> let x = p i in
-%                            (fst (head x), snd (head x)) : tail x)
-%
-%   but how are we to generalise this to an arbitrary monad?
-%
-% The @zeroOrMore@ function performs an action repeatedly - returning
-% the list of all results obtained.  The @oneOrMore@ function is similar
-% but the action must succeed at least once.  That is,
-% \bprog
-% <at>
-% zeroOrMore m = zero ++ 
-%               [ [a0]       | a0 <- m ] ++
-%               [ [a0,a1]    | a0 <- m, a1 <- m ] ++
-%               [ [a0,a1,a2] | a0 <- m, a1 <- m, a2 <- m ] ++
-%               ...
-% 
-% oneOrMore m  = [ [a0]       | a0 <- m ] ++
-%               [ [a0,a1]    | a0 <- m, a1 <- m ] ++
-%               [ [a0,a1,a2] | a0 <- m, a1 <- m, a2 <- m ] ++
-%               ...
-% <at>
-% \eprog
-
-The @when@ and @unless@ functions provide conditional execution of
-monadic expressions.  For example,
-\bprog
-@
-when debug (putStr "Debugging\n")
-@
-\eprog
-will output the string @"Debugging\n"@ if the Boolean value @debug@ is
-@True@, and otherwise do nothing.
-
-The monadic lifting operators promote a function to a monad.  The
-function arguments are scanned left to right.  For example,
-\bprog
-@
-liftM2 (+) [0,1] [0,2] = [0,2,1,3]
-liftM2 (+) (Just 1) Nothing = Nothing
-@
-\eprog
-
-In many situations, the @liftM@ operations can be replaced by uses
-of @ap@, which promotes function application.
-\bprog
-@
-return f `ap` x1 `ap` ... `ap` xn
-@
-\eprog
-is equivalent to
-\bprog
-@
-liftMn f x1 x2 ... xn
-@
-\eprog
-\clearpage
-\subsection{Library {\tt Monad}}
-\inputHS{lib-code/Monad}
-
-%**~footer
-
diff --git a/report/numeric.verb b/report/numeric.verb
deleted file mode 100644 (file)
index a00cfb0..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-%**<title>The Haskell 98 Library Report: Numerics</title>
-%**~header
-\section{Numeric}
-\label{lib-numeric}
-
-\outline{
-\inputHS{lib-hdrs/Numeric}
-}
-This library contains assorted numeric functions, many of which are
-used in the standard Prelude.  
-
-In what follows, recall the following type definitions from the @Prelude@:
-\bprog
-@ 
-  type ShowS = String -> String
-  type ReadS = String -> [(a,String)]
-@
-\eprog
-
-\subsection{Showing functions}
-
-\begin{itemize}
-\item @showSigned :: (Real a) => (a -> ShowS) -> Int -> a -> ShowS@ \\ converts a
-possibly-negative @Real@ value of type @a@ to a string.  In the call "(@showSigned@ ~show ~prec ~val)",
-"val" is the value to show, "prec" is the precedence of the enclosing context, and "show" is
-a function that can show unsigned values.
-
-\item @showIntAtBase :: Integral a => a -> (Int -> Char) -> a -> ShowS@ \\
-shows a {\em non-negative} @Integral@ number using the base specified by the first argument,
-and the character representation specified by the second.
-
-\item @showInt, showOct, showHex :: Integral a => a -> ShowS@ \\ 
-show {\em non-negative} @Integral@ numbers in base 10, 8, and 16 respectively.
-
-\item 
-@showFFloat, showEFloat, showGFloat@ \\
-@    :: (RealFloat a) => Maybe Int -> a -> ShowS@ \\
-These three functions all show signed @RealFloat@ values:
-\begin{itemize}
-\item @showFFloat@ uses standard decimal notation (e.g. @245000@, @0.0015@).
-\item @showEFloat@ uses scientific (exponential) notation (e.g. @2.45e2@, @1.5e-3@).
-\item @showGFloat@ uses standard decimal notation for arguments whose absolute value lies 
-between @0.1@ and @9,999,999@, and scientific notation otherwise.
-\end{itemize}
-In the call "(@showEFloat@ ~digs ~val)", if "digs" is @Nothing@, the value is shown to full
-precision; if "digs" is "@Just@~ d", then at most "d" digits after the decimal point are shown.
-Exactly the same applies to the "digs" argument of the other two functions.
-
-\item @floatToDigits  :: (RealFloat a) => Integer -> a -> ([Int], Int)@ \\
-converts a base and a value to the representation of the value in digits, plus
-an exponent.  More specifically, if
-$$
-@floatToDigits@~b~r = @([@d_1, d_2, ... d_n@], @e@)@
-$$
-then the following properties hold:
-\begin{itemize}
-\item $r =  0.d_1 d_2 ..., d_n ~*~ b^e$
-\item $n \geq 0$
-\item $d_1 \neq 0 ~ \mbox{(when $n > 0$)}$
-\item $0 \leq d_i \leq b-1$
-\end{itemize}
-\end{itemize}
-
-\subsection{Reading functions}
-
-\begin{itemize}
-\item @readSigned :: (Real a) => ReadS a -> ReadS a@ \\ 
-reads a {\em signed} @Real@ value,
-given a reader for an unsigned value.
-
-\item @readInt :: (Integral a) => a -> (Char->Bool) -> (Char->Int) -> ReadS a@ \\
-reads an {\em unsigned} @Integral@ value in an arbitrary base.  In the call "(@readInt@~ base ~isdig ~d2i)",
-"base" is the base, "isdig" is a predicate distinguishing valid digits in this base, and "d2i" converts
-a valid digit character to an @Int@.
-
-\item @readFloat :: (RealFrac a) => ReadS a@ \\ 
-reads an {\em unsigned} @RealFrac@ value, expressed in decimal scientific notation.
-
-\item @readDec, readOct, readHex :: (Integral a) => ReadS a@  \\
-each read an unsigned number, in decimal, octal, and hexadecimal notation respectively.
-In the hexadecimal case, both upper or lower case letters are allowed.
-
-\item @lexDigits :: ReadS String@ reads a non-empty string of decimal digits.
-\end{itemize}
-(NB: @readInt@ is the ``dual'' of @showIntAtBase@, and @readDec@ is the ``dual'' of @showInt@.
-The inconsistent naming is a historical accident.)
-
-\subsection{Miscellaneous}
-
-\begin{itemize}
-\item @fromRat :: (RealFloat a) => Rational -> a@ converts a @Rational@ value
-into any type in class @RealFloat@.
-\end{itemize}
-
-\subsection{Library {\tt Numeric}}
-\inputHS{lib-code/Numeric}
-
-%**~footer
-
-
diff --git a/report/prelude-index.idx b/report/prelude-index.idx
deleted file mode 100644 (file)
index 1f71209..0000000
+++ /dev/null
@@ -1,281 +0,0 @@
-<title> Haskell 98 Prelude Index </title>
-<body bgcolor="##ffffff"><i>The Haskell 98 Report</i><br>
-<a href="index.html">top</a><hr>
-
-<h3> Index of the Haskell 98 Prelude </h3>
-
-<h4> Types and Synonyms </h4>
-Instances which are not defined by Haskell code the Prelude (a ... is used)
-are not hyperlinked.
-<p>
-<pre>
-data #T() = ()  deriving (Eq, Ord, Enum, Bounded) #S6.1.5
-      Instances: #IRead#() #IShow#()
-data #T[a] = [] | a : [a]  deriving (Eq, Ord) #S6.1.3
-      Instances: #IRead#[a] #IShow#[a] #IFunctor#[a] #IMonad#[a]
-data #T(a,b) = (a,b) deriving (Eq, Ord, Bounded) #S6.1.4 
-      Instances: #IRead#(a,b) #IShow#(a,b)
-data a->b #S6.1.6
-data #TBool = False | True deriving (Eq, Ord, Enum, Read, Show, Bounded) #S6.1.1
-data #TChar #S6.1.2
-       Instances: Eq Ord #IEnum#Char #IRead#Char #IShow#Char 
-data #TDouble #S6.4 
-       Instances: Eq Ord Enum Read Show Num Real Fractional RealFrac Floating RealFloat
-data #TEither a b  e=  Left a | Right b deriving (Eq, Ord, Read, Show) #S6.1.8
-type #TFilePath =  String #S7.1
-data #TFloat #S6.4
-       Instances: Eq Ord Enum Read Show Num Real Fractional RealFrac Floating RealFloat
-data #TInt #S6.4
-       Instances: Eq Ord Enum Read Show Num Real Integral Bounded
-data #TInteger #S6.4
-       Instances: Eq Ord Enum Read Show Num Real Integral
-data #TIO a #S6.1.7
-       Instances: #IFunctor#IO Monad
-data #TIOError #S6.1.7
-       Instances: Show Eq
-data #TMaybe a  =  Nothing | Just a deriving (Eq, Ord, Read, Show) #S6.1.8
-        Instances: #IFunctor#Maybe #IMonad#Maybe
-data #TOrdering = LT | EQ | GT  deriving (Eq, Ord, Enum, Read, Show, Bounded) #S6.1.8
-type #TReadS a = String -> [(a,String)] #S6.3.3
-type #TShowS = String -> String #S6.3.3
-type #TString = [Char] #S6.1.2
-</pre>
-
-<h4> Constructors </h4>
-<pre>
-#L[]#T[a]
-#L:#T[a]
-#L(,)#T(a,b)
-#LEQ#TOrdering
-#LFalse#TBool
-#LGT#TOrdering
-#LJust#TMaybe
-#LLeft#TEither
-#LLT#TOrdering
-#LNothing#TMaybe
-#LRight#TEither
-#LTrue#TBool
-
-</pre>
-
-<h4> Classes </h4>
-<pre>
-class                             #TBounded a    #S6.3.7
-class                             #TEnum a       #S6.3.4
-class                             #TEq a         #S6.3.1
-class           (Fractional a) => #TFloating a   #S6.4
-class                  (Num a) => #TFractional a #S6.4
-class                             #TFunctor f    #S6.3.5
-class         (Real a, Enum a) => #TIntegral a   #S6.4
-class                             #TMonad m      #S6.3.6
-class           (Eq a, Show a) => #TNum a        #S6.4
-class                   (Eq a) => #TOrd a        #S6.3.2
-class                             #TRead a       #S6.3.3
-class           (Num a, Ord a) => #TReal a       #S6.4
-class (RealFrac a, Floating a) => #TRealFloat a  #S6.4  
-class   (Real a, Fractional a) => #TRealFrac a   #S6.4
-class                             #TShow a       #S6.3.3 
-
-</pre>
-<h4> Functions and Methods </h4>
-<table>
-#table
-#V(!!)             :: [a] -> Int -> a #&[0,1,2] !! 1 = 1
-#V($)              :: (a -> b) -> a -> b #&f x $ g y = f x (g y)    
-#V($!)             :: (a -> b) -> (a -> b) #&#S6.2
-#V(&&)             :: Bool -> Bool -> Bool #&Boolean `and'
-#V(||)             :: Bool -> Bool -> Bool #&Boolean `or'
-#V(*)              :: Num a => a -> a -> a 
-#V(**)             :: Floating a => a -> a -> a 
-#V(+)              :: Num a => a -> a -> a
-#V(++)             :: [a] -> [a] -> [a] #&"abc" ++ "def" = "abcdef"
-#V(-)              :: Num a => a -> a -> a 
-#V(.)              :: (b -> c) -> (a -> b) -> a -> c #&Function composition
-#V(/)              :: Fractional a => a -> a -> a 
-#V(/=)             :: Eq a => a -> a -> Bool #&not equal
-#V(<)              :: Ord a => a -> a -> Bool 
-#V(<=)             :: Ord a => a -> a -> Bool 
-#V(==)             :: Eq a => a -> a -> Bool 
-#V(=<<)            :: Monad a => (a -> m b) -> m a -> m b  #&Monadic binding #S6.3.6
-#V(>)              :: Ord a => a -> a -> Bool 
-#V(>=)             :: Ord a => a -> a -> Bool 
-#V(>>)             :: Monad m => m a -> m b -> m b #&Monadic binding #S6.3.6
-#V(>>=)            :: Monad m => m a -> (a -> m b) -> m b #&Monadic binding #S6.3.6
-#V(^)              :: (Num a, Integral b) => a -> b -> a 
-#V(^^)             :: (Fractional a, Integral b) => a -> b -> a #&negative exponent allowed
-#Vabs              :: Num a => a -> a 
-#Vacos             :: Floating a => a -> a 
-#Vacosh            :: Floating a => a -> a 
-#Vall              :: (a -> Bool) -> [a] -> Bool #&all (/= 'a') "cba" = False
-#Vand              :: [Bool] -> Bool #&and [True, True, True] = True
-#Vany              :: (a -> Bool) -> [a] -> Bool #&any (== 'c') "abc" = True
-#VappendFile       :: FilePath -> String -> IO ()
-#VapplyM           :: Monad m => (a -> m b) -> m a -> m b
-#VasTypeOf         :: a -> a -> a #&Sort of a type cast
-#Vasin             :: Floating a => a -> a 
-#Vasinh            :: Floating a => a -> a 
-#Vatan             :: Floating a => a -> a 
-#Vatan2            :: RealFrac a => a -> a 
-#Vatanh            :: Floating a => a -> a 
-#Vbreak            :: (a -> Bool) -> [a] -> ([a], [a]) #&break (<2) [1,2,3] = ([1],[2,3])
-#Vcatch            :: IO a -> (IOError -> IO a) -> IO a 
-#Vceiling          :: (RealFrac a, Integral b) => a -> b 
-#Vcompare          :: Ord a => a -> a -> Ordering 
-#Vconcat           :: MonadPlus m => [m a] -> m a #&concat ["a","bc","d"] = "abcd"
-#VconcatMap        :: (a -> [b]) -> [a] -> [b]
-#Vconst            :: a -> b -> a
-#Vcos              :: Floating a => a -> a 
-#Vcosh             :: Floating a => a -> a 
-#Vcurry            :: ((a, b) -> c) -> a -> b -> c
-#Vcycle            :: [a] -> [a] #&cycle "abc" = "abcabcabc ..."
-#VdecodeFloat      :: RealFloat a => a -> (Integer, Int) 
-#Vdiv              :: Integral a => a -> a -> a 
-#VdivMod           :: Integral a => a -> a -> (a, a) 
-#Vdrop             :: Int -> [a] -> [a] #&drop 2 "abcd" = "cd"
-#VdropWhile        :: (a -> Bool) -> [a] -> [a] #&dropWhile (>3) [5,3,5] = [3,5]
-#Veither           :: (a -> c) -> (b -> c) -> Either a b -> c
-#Velem             :: Eq a => a -> [a] -> Bool #&'a' `elem` "abc" = True
-#VencodeFloat      :: RealFloat a => Integer -> Int -> a 
-#VenumFrom         :: Enum a => a -> [a] #&[n..]
-#VenumFromThen     :: Enum a => a -> a -> [a] #&[m,n..]
-#VenumFromThenTo   :: Enum a => a -> a -> a -> [a] #&[m,n..o]
-#VenumFromTo       :: Enum a => a -> a -> [a] #&[m..n]
-#Verror            :: String -> a #& #S3.1
-#Veven             :: Integral a => a -> Bool
-#Vexp              :: Floating a => a -> a 
-#Vexponent         :: RealFloat a => a -> Int 
-#Vfail             :: Monad m => String -> m a
-#Vfilter           :: (a -> Bool) -> [a] -> [a]
-#Vflip             :: (a -> b -> c) -> (b -> a -> c)
-#VfloatDigits      :: RealFloat a => a -> Int 
-#VfloatRadix       :: RealFloat a => a -> Integer 
-#VfloatRange       :: RealFloat a => a -> (Int, Int) 
-#Vfloor            :: (RealFrac a, Integral b) => a -> b 
-#Vfmap             :: Functor f => (a -> b) -> f a -> f b
-#Vfoldl            :: (a -> b -> a) -> a -> [b] -> a #&foldl (+) 0 [a,b,c] = ((0+a)+b)+c
-#Vfoldl1           :: (a -> a -> a) -> [a] -> a #&foldl1 (+) [a,b,c] = (a+b)+c
-#Vfoldr            :: (a -> b -> b) -> b -> [a] -> b #&foldr (+) 0 [a,b,c] = a+(b+(c+0))
-#Vfoldr1           :: (a -> a -> a) -> [a] -> a #&foldr1 (+) [a,b,c] = a+(b+c)
-#VfromEnum         :: Enum a => a -> Int 
-#VfromInteger      :: Num a => Integer -> a #&#S3.2
-#VfromIntegral     :: (Integral a, Num b) => a -> b
-#VfromRational     :: Fractional a => Rational -> a #&#S3.2
-#Vfst              :: (a, b) -> a
-#Vgcd              :: (Integral a) => a -> a -> a
-#VgetChar          :: IO Char #&eof generates an IOError
-#VgetContents      :: IO String
-#VgetLine          :: IO String #&eof generates an IOError
-#Vhead             :: [a] -> a
-#Vid               :: a -> a
-#Vinit             :: [a] -> [a]#&init "abcd" = "abc"
-#Vinteract         :: (String -> String) -> IO ()
-#VioError          :: IOError -> IO a 
-#VisDenormalized   :: RealFloat a => a -> Bool 
-#VisIEEE           :: RealFloat a => a -> Bool 
-#VisInfinite       :: RealFloat a => a -> Bool 
-#VisNaN            :: RealFloat a => a -> Bool 
-#VisNegativeZero   :: RealFloat a => a -> Bool 
-#Viterate          :: (a -> a) -> a -> [a] #&iterate (++ " ") "" = ["", " ", "  ",...]
-#Vlast             :: [a] -> a #&last "abcde" = "e"
-#Vlcm              :: Integral a => a -> a -> a
-#Vlength           :: [a] -> Int #&length "Abc" = 3
-#Vlex              :: ReadS String #&lex "abc def" = [("abc"," def")]
-#Vlines            :: String -> [String]
-#Vlog              :: Floating a => a -> a 
-#VlogBase          :: Floating a => a -> a -> a 
-#Vlookup           :: Eq a => a -> [(a, b)] -> Maybe b
-#Vmap              :: (a -> b) -> [a] -> [b] 
-#VmapM             :: Monad m => (a -> m b) -> [a] -> m [b]
-#VmapM_            :: Monad m => (a -> m b) -> [a] -> m ()
-#Vmax              :: Ord a => a -> a -> a 
-#VmaxBound         :: Bounded a => a 
-#Vmaximum          :: Ord a => [a] -> a
-#Vmaybe            :: b -> (a -> b) -> Maybe a -> b #&maybe 0 (+1) (Just 1) = 2
-#Vmin              :: Ord a => a -> a -> a 
-#VminBound         :: Bounded a => a 
-#Vminimum          :: Ord a => [a] -> a
-#Vmod              :: Integral a => a -> a -> a 
-#Vnegate           :: Num a => a -> a 
-#Vnot              :: Bool -> Bool
-#VnotElem          :: Eq a => a -> [a] -> Bool
-#Vnull             :: [a] -> Bool
-#Vodd              :: Integral a => a -> Bool
-#Vor               :: [Bool] -> Bool
-#Votherwise        :: Bool
-#Vpi               :: Floating a => a 
-#Vpred             :: Enum a => a -> a #&pred True = False
-#Vprint            :: Show a => a -> IO () #&adds a newline
-#Vproduct          :: Num a => [a] -> a
-#VproperFraction   :: (RealFrac a, Integral b) => a -> (b, a) 
-#VputChar          :: Char -> IO ()
-#VputStr           :: String -> IO ()
-#VputStrLn         :: String -> IO () #&adds a newline
-#Vquot             :: Integral a => a -> a -> a 
-#VquotRem          :: Integral a => a -> a -> (a, a) 
-#Vread             :: Read a => String -> a
-#VreadFile         :: FilePath -> IO String
-#VreadIO           :: Read a => String -> IO a #&fails with IOError
-#VreadList         :: Read a => ReadS [a]
-#VreadLn           :: Read a => IO a
-#VreadParen        :: Bool -> ReadS a -> ReadS a
-#Vreads            :: Read a => ReadS a #&reads "1 2" :: [(Int,String)] = [(1," 2")]
-#VreadsPrec        :: Read a => Int -> ReadS a
-#VrealToFrac       :: (Real a, Fractional b) => a -> b
-#Vrecip            :: Fractional a => a -> a 
-#Vrem              :: Integral a => a -> a -> a 
-#Vrepeat           :: a -> [a] #&repeat 'a' = "aaaaaaaaa..."
-#Vreplicate        :: Int -> a -> [a] #&replicate 4 'a' = "aaaa"
-#Vreturn           :: Monad m => a -> m a 
-#Vreverse          :: [a] -> [a] #&reverse "abc" = "cba"
-#Vround            :: (RealFrac a, Integral b) => a -> b 
-#VscaleFloat       :: RealFloat a => Int -> a -> a 
-#Vscanl            :: (a -> b -> a) -> a -> [b] -> [a] #&scanl (+) 0 [1,2,3] = [0,1,3,6]
-#Vscanl1           :: (a -> a -> a) -> [a] -> [a] #&scanl1 (+) [1,2,3] = [1,3,6]
-#Vscanr            :: (a -> b -> b) -> b -> [a] -> [b] #&scanr (+) 0 [1,2,3] = [6,5,3,0]
-#Vscanr1           :: (a -> a -> a) -> [a] -> [a] #&scanr1 (+) [1,2,3] = [6,5,3]
-#Vseq              :: a -> b -> b #&#S6.2
-#Vsequence         :: Monad m => [m a] -> m [a] 
-#Vsequence_        :: Monad m => [m a] -> m () #&do operations in sequence
-#Vshow             :: Show a => a -> String #&#S6.3.3
-#VshowChar         :: Char -> ShowS
-#VshowList         :: Show a => [a] -> ShowS
-#VshowParen        :: Bool -> ShowS -> ShowS
-#VshowString       :: String -> ShowS
-#Vshows            :: Show a => a -> ShowS #&#S6.3.3
-#VshowsPrec        :: Show a => Int -> a -> ShowS #&#S6.3.3
-#Vsignificand      :: RealFloat a => a -> a 
-#Vsignum           :: Num a => a -> a 
-#Vsin              :: Floating a => a -> a 
-#Vsinh             :: Floating a => a -> a 
-#Vsnd              :: (a, b) -> b
-#Vspan             :: (a -> Bool) -> [a] -> ([a], [a]) #&span isAlpha "ab cd" = ("ab"," cd")
-#VsplitAt          :: Int -> [a] -> ([a], [a]) #&splitAt 2 "abcdef" = ("ab","cdef")
-#Vsqrt             :: Floating a => a -> a 
-#Vsubtract         :: Num a => a -> a -> a
-#Vsucc             :: Enum a => a -> a #&succ False = True
-#Vsum              :: Num a => [a] -> a #&sum [1,2,3] = 6
-#Vtail             :: [a] -> [a] #&tail "abc" = "bc"
-#Vtake             :: Int -> [a] -> [a] #&take 3 "abcde" = "abc"
-#VtakeWhile        :: (a -> Bool) -> [a] -> [a] #&takeWhile (> 2) [3,2,1] = [3]
-#Vtan              :: Floating a => a -> a 
-#Vtanh             :: Floating a => a -> a 
-#VtoEnum           :: Enum a => Int -> a #&toEnum 0 :: Bool = False
-#VtoInteger        :: Integral a => a -> Integer 
-#VtoRational       :: Real a => a -> Rational 
-#Vtruncate         :: (RealFrac a, Integral b) => a -> b 
-#Vuncurry          :: (a -> b -> c) -> ((a, b) -> c)
-#Vundefined        :: a #&#S3.1
-#Vunlines          :: [String] -> String
-#Vuntil            :: (a -> Bool) -> (a -> a) -> a -> a #&until (> 3) (+ 2) 0 = 4
-#Vunwords          :: [String] -> String
-#Vunzip            :: [(a, b)] -> ([a], [b]) #&unzip [('a','b'),('c','d')] = ("ac",bd")
-#Vunzip3           :: [(a, b, c)] -> ([a], [b], [c])
-#VuserError        :: String  -> IOError
-#Vwords            :: String -> [String] #&words "ab d as+3" = ["ab","d","as+3"]
-#VwriteFile        :: FilePath -> String -> IO ()
-#Vzip              :: [a] -> [b] -> [(a, b)] #&zip "abc" "de" = [('a','d'), ('b',e')]
-#Vzip3             :: [a] -> [b] -> [c] -> [(a, b, c)]
-#VzipWith          :: (a -> b -> c) -> [a] -> [b] -> [c] #&zipWith (+) [1,2] [3,4] = [4,6]
-#VzipWith3         :: (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d]
-#endtable
-</table>
diff --git a/report/random.verb b/report/random.verb
deleted file mode 100644 (file)
index d4578ac..0000000
+++ /dev/null
@@ -1,273 +0,0 @@
-%**<title>The Haskell 98 Library Report: Random Numbers</title>
-%**~header
-\section{Random Numbers}
-\label{random numbers}
-
-\outline {
-\inputHS{lib-hdrs/Random}
-}
-
-The @Random@ library deals with the common task of 
-pseudo-random number generation.  The library makes it possible to
-generate repeatable results, by starting with a specified initial
-random number generator; or to get different results on each run
-by using the system-initialised generator, or by supplying a seed
-from some other source.
-
-The library is split into two layers:
-\begin{itemize}
-\item A core {\em random number generator} provides a supply of bits.
-The class @RandomGen@ provides a common interface to such generators.
-
-\item The class @Random@ provides a way to extract particular values from
-a random number generator.  For example, the @Float@ instance of @Random@ 
-allows one to generate random values of type @Float@.
-\end{itemize}
-
-\subsection{The @RandomGen@ class, and the @StdGen@ generator}
-
-The class @RandomGen@ provides a common interface to random number generators.
-\bprog
-@
-  class RandomGen g where
-    genRange :: g -> (Int,Int)
-    next     :: g  -> (Int, g)
-    split    :: g -> (g, g)
-  
-    -- Default method
-    genRange g = (minBound,maxBound)
-@
-\eprog
-\indextt{next}
-\indextt{split}
-\indextt{genRange}
-\indextt{RandomGen}
-\begin{itemize}
-\item The @genRange@ operation yields the range of values returned by
-the generator. 
-
-It is required that:
-\begin{itemize}
-\item If $(a,b) ~=~ @genRange@~ g$, then $a < b$.
-\item $@genRange@~\bot ~\neq~ \bot$.  
-\end{itemize}
-The second condition ensures that @genRange@ cannot examine its
-argument, and hence the value it returns can be determined only by the
-instance of @RandomGen@.  That in turn allows an implementation to make
-a single call to @genRange@ to establish a generator's range, without
-being concerned that the generator returned by (say) @next@ might have a different
-range to the generator passed to @next@.
-
-\item The @next@ operation returns an @Int@ that is uniformly distributed
-in the range returned by @genRange@ (including both end points), and a new
-generator.
-
-\item The @split@ operation allows one to obtain two independent random number
-generators.  This is very useful in functional programs (for example, when
-passing a random number generator down to recursive calls), but very little work
-has been done on statistically robust implementations of @split@
-([1,4] are the only examples we know of).
-\end{itemize}
-
-The @Random@ library provides one instance of @RandomGen@, the abstract data
-type @StdGen@:
-\bprog
-@
-  data StdGen = ...    -- Abstract
-  
-  instance RandomGen StdGen where ...
-  instance Read      StdGen where ...
-  instance Show      StdGen where ...
-  
-  mkStdGen :: Int -> StdGen
-@
-\eprog
-\indextycon{StdGen}
-\indextt{mkStdGen}
-The @StgGen@ instance of @RandomGen@ has a @genRange@ of at least 30 bits.
-
-The result of repeatedly using @next@ should be at least as
-statistically robust as the ``Minimal Standard Random Number Generator''
-described by [2,3].  Until more is known about implementations of @split@,
-all we require is that @split@ deliver generators that are (a) not identical
-and (b) independently robust in the sense just given.
-
-The @Show@/@Read@ instances of @StdGen@ provide a primitive way to save
-the state of a random number generator.
-It is required that @read (show g) == g@.
-
-In addition, @read@ may be used to map an arbitrary string (not
-necessarily one produced by @show@) onto a value of type @StdGen@.
-In general, the @read@ instance of @StdGen@ has the following properties:
-\begin{itemize}
-\item It guarantees to succeed on any string.
-\item It guarantees to consume only a finite portion of the string.
-\item Different argument strings are likely to result in different results.
-\end{itemize}
-
-The function @mkStdGen@ provides an alternative way of producing an initial generator,
-by mapping an @Int@ into a generator.  Again, distinct arguments should be likely
-to produce distinct generators.
-
-Programmers may, of course, supply their own instances of @RandomGen@.
-
-{\em Implementation warning.}  A superficially attractive implementation of @split@ is
-\bprog
-@
-  instance RandomGen MyGen where
-    ...
-    split g = (g, variantOf g)
-@
-\eprog
-Here, @split@ returns @g@ itself and a new generator derived from @g@.
-But now consider these two apparently-independent generators:
-\bprog
-@
-  g1 = snd (split g)
-  g2 = snd (split (fst (split g)))
-@
-\eprog
-If @split@ genuinely delivers independent generators (as specified), then @g1@ and
-@g2@ should be independent, but in fact they are both equal to @variantOf g@.
-Implementations of the above form do not meet the specification.
-
-\subsection{The @Random@ class}
-
-With a source of random number supply in hand, the @Random@ class allows
-the programmer to extract random values of a variety of types:
-\bprog
-@
-class Random a where
-   randomR :: RandomGen g => (a, a) -> g -> (a, g)
-   random  :: RandomGen g => g -> (a, g)
-
-   randomRs :: RandomGen g => (a, a) -> g -> [a]
-   randoms  :: RandomGen g => g -> [a]
-
-   randomRIO :: (a,a) -> IO a
-   randomIO :: IO a
-
-     -- Default methods
-   randoms g = x : randoms g' 
-                  where 
-                    (x,g') = random g
-   randomRs = ...similar...
-
-   randomIO        = getStdRandom random
-   randomRIO range = getStdRandom (randomR range)
-
-
-instance Random Int     where ...
-instance Random Integer where ...
-instance Random Float   where ...
-instance Random Double  where ...
-instance Random Bool    where ...
-instance Random Char    where ...
-@
-\eprog
-\indexclass{Random}
-\indextt{random}
-\indextt{randomR}
-\indextt{randoms}
-\indextt{randomRs}
-\indextt{randomIO}
-\indextt{randomRIO}
-\begin{itemize}
-\item @randomR@ takes a range "(lo,hi)" and a random number generator "g",
-and returns a random value uniformly distributed in the closed interval "[lo,hi]", together
-with a new generator.  It is unspecified what happens if "lo>hi".
-For continuous types there is no requirement that the values "lo" and "hi" are
-ever produced, but they may be, depending on the implementation and the interval.
-
-% \begin{itemize}
-% \item For discrete types (such as @Int@ or @Bool@), 
-% ``uniformly distributed'' means that each value is equally likely to occur.
-% \item For floating-point types (instances of @Floating@, such as @Float@ or @Double@),
-% the probability of any particular (representable) value "v"
-% occurring is proportional to "ulp(v)/(h-l)", where "ulp(v)" is the
-% size of a unit change in the least significant bit position of "v".
-% \item For continuous types, such as @Rational@, ``uniformly distributed'' means
-% that the probability distribution of returned values is uniform over the interval.
-% \end{itemize}
-
-% \begin{itemize}
-% \item For discrete types (such as @Int@ or @Bool@), the range is the closed interval "[l,h]".
-% \item For fractional types (instances of @Fractional@, such as @Float@ or @Double@),
-% the range is the semi-closed interval "[l,h)".
-% \end{itemize}
-% for discrete types, or if "l \geq h" for fractional types.
-
-\item @random@ does the same as @randomR@, but does not take a range.
-\begin{itemize}
-\item For bounded types (instances of @Bounded@, such as @Char@), 
-the range is normally the whole type.
-\item For fractional types, the range is normally the semi-closed interval "[0,1)".
-\item For @Integer@, the range is (arbitrarily) the range of @Int@.
-\end{itemize}
-
-\item The plural versions, @randomRs@ and @randoms@, produce an infinite list of random
-values, and do not return a new generator.
-
-\item The @IO@ versions, @randomRIO@ and @randomIO@, use the global random number
-generator (see Section~\ref{global-rng}).
-\end{itemize}
-
-\subsection{The global random number generator}
-\label{global-rng}
-
-There is a single, implicit, global random number generator
-of type @StdGen@, held in some global variable maintained by the @IO@ monad.
-It is initialised automatically in some system-dependent fashion,
-for example, by using the time of day, or Linux's kernel random number generator.
-To get deterministic behaviour, use @setStdGen@.
-\bprog
-@
-  setStdGen    :: StdGen -> IO ()      
-  getStdGen    :: IO StdGen            
-  newStdGen    :: IO StdGen
-  getStdRandom :: (StdGen -> (a, StdGen)) -> IO a
-@
-\eprog
-\indextt{setStdGen}
-\indextt{getStdGen}
-\indextt{newStdGen}
-\indextt{getStdRandom}
-\begin{itemize}
-\item @getStdGen@ and @setStdGen@ get and set the global random
-number generator, respectively.
-
-\item @newStdGen@ applies @split@ to the current global random generator,
-updates it with one of the results, and returns the other.
-
-\item @getStdRandom@ uses the supplied function to get a value from
-the current global random generator, and updates the
-global generator with the new generator returned by the function.
-For example, @rollDice@ gets a random integer between 1 and 6:
-\bprog
-@
-  rollDice :: IO Int
-  rollDice = getStdRandom (randomR (1,6))
-@
-\eprog
-\end{itemize}    
-
-\subsection*{References}
-\begin{description}
-\item[{[1]}] FW Burton and RL Page, ``Distributed random number generation'',
-       Journal of Functional Programming, 2(2):203-212, April 1992.
-
-\item[{[2]}] SK Park, and KW Miller, ``Random number generators - good ones are hard to find'',
-       Comm ACM 31(10), Oct 1988, pp1192-1201.
-
-\item[{[3]}] DG Carta, ``Two fast implementations of the minimal standard random number generator'',
-       Comm ACM, 33(1), Jan 1990, pp87-88.
-
-\item[{[4]}] P Hellekalek, ``Don't trust parallel Monte Carlo'', 
-ACM SIGSIM Simulation Digest 28(1), pp82-89, July 1998.
-\end{description}
-
-The Web site @http://random.mat.sbg.ac.at/@ is a great source of information.
-
-
-%**~efooter
-
diff --git a/report/ratio.verb b/report/ratio.verb
deleted file mode 100644 (file)
index 7bc1774..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-%**<title>The Haskell 98 Library Report: Rational Numbers</title>
-%**~header
-\section{Rational Numbers}
-\index{rational numbers}
-
-\outline{
-\inputHS{lib-hdrs/Ratio}
-}
-
-For each @Integral@ type $t$, there is
-a type @Ratio@\indextycon{Ratio} $t$ of rational pairs with components of
-type $t$.  The type name @Rational@\indexsynonym{Rational} is a synonym for
-@Ratio Integer@.  
-
-@Ratio@ is an instance of classes @Eq@, @Ord@, @Num@, @Real@, 
-@Fractional@, @RealFrac@, @Enum@, @Read@, and @Show@.  In each case,
-the instance for $@Ratio@~t$ simply ``lifts'' the corresponding operations
-over $t$.  If $t$ is a bounded type, the results may be unpredictable;
-for example @Ratio Int@ may give rise to integer overflow even for
-rational numbers of small absolute size.
-
-The operator @(%)@\index{%@@{\tt  {\char'045}}} forms the ratio of two
-integral numbers, reducing the fraction to terms with no common factor
-and such that the denominator is positive.  The functions
-@numerator@\indextt{numerator}
-and @denominator@\indextt{denominator} extract the components of a
-ratio; these are in reduced form with a positive denominator.
-@Ratio@ is an abstract type.  For example, @12 % 8@ is reduced to 3/2
-and @12 % (-8)@ is reduced to (-3)/2.
-
-The @approxRational@ function, applied to two real fractional numbers
-@x@ and @epsilon@, returns the simplest rational number within the open
-interval "(@x@-@epsilon@, @x@+@epsilon@)".
-A rational number "n/d" in reduced form is said to
-be simpler than another "n'/d'" if "|n| \leq |n'|" and "d \leq d'".
-Note that it can be proved that any real interval contains a unique
-simplest rational.
-
-
-%% Deleted the following -- this is implementation detail -- KH/AD.
-% ; here, for simplicity, we assume a closed rational
-% interval.  If such an interval includes at least one whole number, then
-% the simplest rational is the absolutely least whole number.  Otherwise,
-% the bounds are of the form "q/1 + r/d" and "q/1 + r'/d'", where "|r| < d"
-% and "|r'| < d'", and the simplest rational is "q/1" + the reciprocal of
-% the simplest rational between "d'/r'" and "d/r".
-
-\clearpage
-\subsection{Library {\tt Ratio}}
-\label{Ratio}
-\inputHS{lib-code/Ratio}
-
-%**~footer
diff --git a/report/system.verb b/report/system.verb
deleted file mode 100644 (file)
index 62465a9..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-%**<title>The Haskell 98 Library Report: System functions</title>
-%**~header
-
-\section{System Functions}
-\label{System}
-
-\outline{
-\inputHS{lib-hdrs/System}
-}
-\indextycon{ExitCode}\indextt{ExitSuccess}\indextt{ExitFailure}
-\indextt{getArgs}\indextt{getProgName}\indextt{getEnv}
-\indextt{system}\indextt{exitWith}\indextt{exitFailure}
-
-%% It would be less draconian to return [] for operations
-%% other than system, exitWith. KH
-This library describes the interaction of the program with the
-operating system.  
-
-Any @System@ operation could raise an @isIllegalOperation@, as
-described in Section~\ref{IOError}; all other permissible errors are
-described below.  Note that, in particular, if an implementation does
-not support an operation it must raise an @isIllegalOperation@.
-
-The @ExitCode@ type defines the exit codes that a program can return.
-@ExitSuccess@ indicates successful termination; and @ExitFailure@
-"code" indicates program failure with value "code".  The exact
-interpretation of "code" is operating-system dependent.  In
-particular, some values of "code" may be prohibited (for instance, 0 on a
-POSIX-compliant system).
-
-Computation @getArgs@ returns a list of the program's command
-line arguments (not including the program name)\index{program arguments}.
-Computation @getProgName@ returns the name of the program
-as it was invoked\index{program name}.
-Computation @getEnv@~"var" returns the value
-of the environment variable "var"\index{environment variables}.
-If variable "var" is undefined, the
-@isDoesNotExistError@ exception is raised.
-Computation @system@~"cmd" returns the exit code produced when the
-operating system processes the command "cmd"\index{operating system
-commands}.
-
-Computation @exitWith@~"code" terminates the program, returning "code"
-to the program's caller\index{terminating a program}.  Before the
-program terminates, any open or semi-closed handles are first closed.
-The caller may interpret the return code as it wishes, but the program
-should return @ExitSuccess@ to mean normal completion, and
-@ExitFailure @"n" to mean that the program encountered a problem from
-which it could not recover.  The value @exitFailure@ is equal to
-@exitWith (ExitFailure @"exitfail"@)@, where "exitfail" is
-implementation-dependent.  @exitWith@ bypasses the error handling in
-the I/O monad and cannot be intercepted by @catch@.
-
-If a program terminates as a result of calling @error@\indextt{error} or
-because its value is otherwise determined to be "\bot"\index{"\bot"}, then it
-is treated identically to the computation @exitFailure@.  Otherwise, if any
-program "p" terminates without calling @exitWith@ explicitly, it is treated
-identically to the computation
-\bprog
-@(@"p"@ >> exitWith ExitSuccess) `catch` \ _ -> exitFailure@
-\eprog
-\indextt{catch}
-
-%**~footer
diff --git a/report/time.verb b/report/time.verb
deleted file mode 100644 (file)
index e1d3594..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-%**<title>The Haskell 98 Library Report: Dates and Times</title>
-%**~header
-\section{Dates and Times}
-\label{time}
-\index{time}
-\index{time of day}\index{clock time}
-
-%% Note: HBC has Leap year calculations too.
-%% My feeling is that these are unnecessary given the much stronger
-%% ability here to find the differences between dates.
-
-\outline {
-\inputHS{lib-hdrs/Time}
-}
-\outline{
-\inputHS{lib-hdrs/Time1}
-}
-
-The @Time@ library provides standard functionality for clock times,
-including timezone information. It follows RFC~1129 in its use of
-Coordinated Universal Time (UTC).
-
-@ClockTime@ is an abstract type, used for the system's internal clock
-time.  Clock times may be compared directly or converted to a calendar
-time @CalendarTime@ for I/O or other manipulations.
-@CalendarTime@ is a user-readable and manipulable representation of
-the internal @ClockTime@ type.  The numeric fields have the following
-ranges.
-\outline{
-\begin{tabbing}
-\ignorehtml{
-\ \ \ \=ctpicosec\ \ \ \ \=-maxInt\ \=\ldots\ \=$(10^{12})-1$\ \ \ \ \ \=\kill}
-\>\underline{Value}\>\>\underline{Range}\>\>\underline{Comments} \\
-\\
-\>ctYear\>\>-maxInt\'$\ldots$\>maxInt\>Pre-Gregorian dates are inaccurate \\
-\>ctDay\>\>1\'$\ldots$\>31 \\
-\>ctHour\>\>0\'$\ldots$\>23\\
-\>ctMin\>\>0\'$\ldots$\>59\\
-\>ctSec\>\>0\'$\ldots$\>61\>Allows for two Leap Seconds\\
-\>ctPicosec\>\>0\'$\ldots$\>$(10^{12})-1$ \\
-\>ctYDay\>\>0\'$\ldots$\>365\>364 in non-Leap years \\
-\>ctTZ\>\>-89999\'$\ldots$\>89999\>Variation from UTC in seconds
-\end{tabbing}
-}
-The "ctTZName" field is the name of the time zone.  The "ctIsDST" field
-is @True@ if Daylight Savings Time would be in effect, and @False@
-otherwise.
-The @TimeDiff@ type records the difference between two clock times in
-a user-readable way.
-
-Function @getClockTime@ returns the current time in its internal
-representation.  The expression
-@addToClockTime@~"d"~"t" adds a time difference "d" and a
-clock time "t" to yield a new clock time.  The difference "d" may be either
-positive or negative.  The expression @diffClockTimes@~"t1"~"t2"
-returns the difference between two clock times "t1" and "t2" as a
-@TimeDiff@. 
-
-Function @toCalendarTime@~"t" converts "t" to a local time, modified
-by the timezone and daylight savings time settings in force at the
-time of conversion.  Because of this dependence on the local environment,
-@toCalendarTime@ is in the @IO@ monad.
-
-Function @toUTCTime@~"t" converts "t" into a @CalendarTime@
-in standard UTC format.
-@toClockTime@~"l" converts "l" into the corresponding internal
-@ClockTime@ ignoring the contents of the "ctWDay", "ctYDay",
-"ctTZName", and "ctIsDST" fields.
-
-Function @calendarTimeToString@ formats
-calendar times using local conventions and a formatting string.
-
-\subsection{Library {\tt Time}}
-\inputHS{lib-code/Time}
-
-%**~header