packages feed

hack-contrib (empty) → 2009.4.30

raw patch · 23 files changed

+2948/−0 lines, 23 filesdep +ansi-wl-pprintdep +basedep +base64-stringsetup-changed

Dependencies added: ansi-wl-pprint, base, base64-string, bytestring, cgi, containers, data-default, directory, filepath, hack, haskell98, mps, network, old-locale, old-time, template, time, unix, zlib

Files

+ LICENSE view
@@ -0,0 +1,674 @@+                    GNU GENERAL PUBLIC LICENSE+                       Version 3, 29 June 2007++ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>+ Everyone is permitted to copy and distribute verbatim copies+ of this license document, but changing it is not allowed.++                            Preamble++  The GNU General Public License is a free, copyleft license for+software and other kinds of works.++  The licenses for most software and other practical works are designed+to take away your freedom to share and change the works.  By contrast,+the GNU General Public License is intended to guarantee your freedom to+share and change all versions of a program--to make sure it remains free+software for all its users.  We, the Free Software Foundation, use the+GNU General Public License for most of our software; it applies also to+any other work released this way by its authors.  You can apply it to+your programs, too.++  When we speak of free software, we are referring to freedom, not+price.  Our General Public Licenses are designed to make sure that you+have the freedom to distribute copies of free software (and charge for+them if you wish), that you receive source code or can get it if you+want it, that you can change the software or use pieces of it in new+free programs, and that you know you can do these things.++  To protect your rights, we need to prevent others from denying you+these rights or asking you to surrender the rights.  Therefore, you have+certain responsibilities if you distribute copies of the software, or if+you modify it: responsibilities to respect the freedom of others.++  For example, if you distribute copies of such a program, whether+gratis or for a fee, you must pass on to the recipients the same+freedoms that you received.  You must make sure that they, too, receive+or can get the source code.  And you must show them these terms so they+know their rights.++  Developers that use the GNU GPL protect your rights with two steps:+(1) assert copyright on the software, and (2) offer you this License+giving you legal permission to copy, distribute and/or modify it.++  For the developers' and authors' protection, the GPL clearly explains+that there is no warranty for this free software.  For both users' and+authors' sake, the GPL requires that modified versions be marked as+changed, so that their problems will not be attributed erroneously to+authors of previous versions.++  Some devices are designed to deny users access to install or run+modified versions of the software inside them, although the manufacturer+can do so.  This is fundamentally incompatible with the aim of+protecting users' freedom to change the software.  The systematic+pattern of such abuse occurs in the area of products for individuals to+use, which is precisely where it is most unacceptable.  Therefore, we+have designed this version of the GPL to prohibit the practice for those+products.  If such problems arise substantially in other domains, we+stand ready to extend this provision to those domains in future versions+of the GPL, as needed to protect the freedom of users.++  Finally, every program is threatened constantly by software patents.+States should not allow patents to restrict development and use of+software on general-purpose computers, but in those that do, we wish to+avoid the special danger that patents applied to a free program could+make it effectively proprietary.  To prevent this, the GPL assures that+patents cannot be used to render the program non-free.++  The precise terms and conditions for copying, distribution and+modification follow.++                       TERMS AND CONDITIONS++  0. Definitions.++  "This License" refers to version 3 of the GNU General Public License.++  "Copyright" also means copyright-like laws that apply to other kinds of+works, such as semiconductor masks.++  "The Program" refers to any copyrightable work licensed under this+License.  Each licensee is addressed as "you".  "Licensees" and+"recipients" may be individuals or organizations.++  To "modify" a work means to copy from or adapt all or part of the work+in a fashion requiring copyright permission, other than the making of an+exact copy.  The resulting work is called a "modified version" of the+earlier work or a work "based on" the earlier work.++  A "covered work" means either the unmodified Program or a work based+on the Program.++  To "propagate" a work means to do anything with it that, without+permission, would make you directly or secondarily liable for+infringement under applicable copyright law, except executing it on a+computer or modifying a private copy.  Propagation includes copying,+distribution (with or without modification), making available to the+public, and in some countries other activities as well.++  To "convey" a work means any kind of propagation that enables other+parties to make or receive copies.  Mere interaction with a user through+a computer network, with no transfer of a copy, is not conveying.++  An interactive user interface displays "Appropriate Legal Notices"+to the extent that it includes a convenient and prominently visible+feature that (1) displays an appropriate copyright notice, and (2)+tells the user that there is no warranty for the work (except to the+extent that warranties are provided), that licensees may convey the+work under this License, and how to view a copy of this License.  If+the interface presents a list of user commands or options, such as a+menu, a prominent item in the list meets this criterion.++  1. Source Code.++  The "source code" for a work means the preferred form of the work+for making modifications to it.  "Object code" means any non-source+form of a work.++  A "Standard Interface" means an interface that either is an official+standard defined by a recognized standards body, or, in the case of+interfaces specified for a particular programming language, one that+is widely used among developers working in that language.++  The "System Libraries" of an executable work include anything, other+than the work as a whole, that (a) is included in the normal form of+packaging a Major Component, but which is not part of that Major+Component, and (b) serves only to enable use of the work with that+Major Component, or to implement a Standard Interface for which an+implementation is available to the public in source code form.  A+"Major Component", in this context, means a major essential component+(kernel, window system, and so on) of the specific operating system+(if any) on which the executable work runs, or a compiler used to+produce the work, or an object code interpreter used to run it.++  The "Corresponding Source" for a work in object code form means all+the source code needed to generate, install, and (for an executable+work) run the object code and to modify the work, including scripts to+control those activities.  However, it does not include the work's+System Libraries, or general-purpose tools or generally available free+programs which are used unmodified in performing those activities but+which are not part of the work.  For example, Corresponding Source+includes interface definition files associated with source files for+the work, and the source code for shared libraries and dynamically+linked subprograms that the work is specifically designed to require,+such as by intimate data communication or control flow between those+subprograms and other parts of the work.++  The Corresponding Source need not include anything that users+can regenerate automatically from other parts of the Corresponding+Source.++  The Corresponding Source for a work in source code form is that+same work.++  2. Basic Permissions.++  All rights granted under this License are granted for the term of+copyright on the Program, and are irrevocable provided the stated+conditions are met.  This License explicitly affirms your unlimited+permission to run the unmodified Program.  The output from running a+covered work is covered by this License only if the output, given its+content, constitutes a covered work.  This License acknowledges your+rights of fair use or other equivalent, as provided by copyright law.++  You may make, run and propagate covered works that you do not+convey, without conditions so long as your license otherwise remains+in force.  You may convey covered works to others for the sole purpose+of having them make modifications exclusively for you, or provide you+with facilities for running those works, provided that you comply with+the terms of this License in conveying all material for which you do+not control copyright.  Those thus making or running the covered works+for you must do so exclusively on your behalf, under your direction+and control, on terms that prohibit them from making any copies of+your copyrighted material outside their relationship with you.++  Conveying under any other circumstances is permitted solely under+the conditions stated below.  Sublicensing is not allowed; section 10+makes it unnecessary.++  3. Protecting Users' Legal Rights From Anti-Circumvention Law.++  No covered work shall be deemed part of an effective technological+measure under any applicable law fulfilling obligations under article+11 of the WIPO copyright treaty adopted on 20 December 1996, or+similar laws prohibiting or restricting circumvention of such+measures.++  When you convey a covered work, you waive any legal power to forbid+circumvention of technological measures to the extent such circumvention+is effected by exercising rights under this License with respect to+the covered work, and you disclaim any intention to limit operation or+modification of the work as a means of enforcing, against the work's+users, your or third parties' legal rights to forbid circumvention of+technological measures.++  4. Conveying Verbatim Copies.++  You may convey verbatim copies of the Program's source code as you+receive it, in any medium, provided that you conspicuously and+appropriately publish on each copy an appropriate copyright notice;+keep intact all notices stating that this License and any+non-permissive terms added in accord with section 7 apply to the code;+keep intact all notices of the absence of any warranty; and give all+recipients a copy of this License along with the Program.++  You may charge any price or no price for each copy that you convey,+and you may offer support or warranty protection for a fee.++  5. Conveying Modified Source Versions.++  You may convey a work based on the Program, or the modifications to+produce it from the Program, in the form of source code under the+terms of section 4, provided that you also meet all of these conditions:++    a) The work must carry prominent notices stating that you modified+    it, and giving a relevant date.++    b) The work must carry prominent notices stating that it is+    released under this License and any conditions added under section+    7.  This requirement modifies the requirement in section 4 to+    "keep intact all notices".++    c) You must license the entire work, as a whole, under this+    License to anyone who comes into possession of a copy.  This+    License will therefore apply, along with any applicable section 7+    additional terms, to the whole of the work, and all its parts,+    regardless of how they are packaged.  This License gives no+    permission to license the work in any other way, but it does not+    invalidate such permission if you have separately received it.++    d) If the work has interactive user interfaces, each must display+    Appropriate Legal Notices; however, if the Program has interactive+    interfaces that do not display Appropriate Legal Notices, your+    work need not make them do so.++  A compilation of a covered work with other separate and independent+works, which are not by their nature extensions of the covered work,+and which are not combined with it such as to form a larger program,+in or on a volume of a storage or distribution medium, is called an+"aggregate" if the compilation and its resulting copyright are not+used to limit the access or legal rights of the compilation's users+beyond what the individual works permit.  Inclusion of a covered work+in an aggregate does not cause this License to apply to the other+parts of the aggregate.++  6. Conveying Non-Source Forms.++  You may convey a covered work in object code form under the terms+of sections 4 and 5, provided that you also convey the+machine-readable Corresponding Source under the terms of this License,+in one of these ways:++    a) Convey the object code in, or embodied in, a physical product+    (including a physical distribution medium), accompanied by the+    Corresponding Source fixed on a durable physical medium+    customarily used for software interchange.++    b) Convey the object code in, or embodied in, a physical product+    (including a physical distribution medium), accompanied by a+    written offer, valid for at least three years and valid for as+    long as you offer spare parts or customer support for that product+    model, to give anyone who possesses the object code either (1) a+    copy of the Corresponding Source for all the software in the+    product that is covered by this License, on a durable physical+    medium customarily used for software interchange, for a price no+    more than your reasonable cost of physically performing this+    conveying of source, or (2) access to copy the+    Corresponding Source from a network server at no charge.++    c) Convey individual copies of the object code with a copy of the+    written offer to provide the Corresponding Source.  This+    alternative is allowed only occasionally and noncommercially, and+    only if you received the object code with such an offer, in accord+    with subsection 6b.++    d) Convey the object code by offering access from a designated+    place (gratis or for a charge), and offer equivalent access to the+    Corresponding Source in the same way through the same place at no+    further charge.  You need not require recipients to copy the+    Corresponding Source along with the object code.  If the place to+    copy the object code is a network server, the Corresponding Source+    may be on a different server (operated by you or a third party)+    that supports equivalent copying facilities, provided you maintain+    clear directions next to the object code saying where to find the+    Corresponding Source.  Regardless of what server hosts the+    Corresponding Source, you remain obligated to ensure that it is+    available for as long as needed to satisfy these requirements.++    e) Convey the object code using peer-to-peer transmission, provided+    you inform other peers where the object code and Corresponding+    Source of the work are being offered to the general public at no+    charge under subsection 6d.++  A separable portion of the object code, whose source code is excluded+from the Corresponding Source as a System Library, need not be+included in conveying the object code work.++  A "User Product" is either (1) a "consumer product", which means any+tangible personal property which is normally used for personal, family,+or household purposes, or (2) anything designed or sold for incorporation+into a dwelling.  In determining whether a product is a consumer product,+doubtful cases shall be resolved in favor of coverage.  For a particular+product received by a particular user, "normally used" refers to a+typical or common use of that class of product, regardless of the status+of the particular user or of the way in which the particular user+actually uses, or expects or is expected to use, the product.  A product+is a consumer product regardless of whether the product has substantial+commercial, industrial or non-consumer uses, unless such uses represent+the only significant mode of use of the product.++  "Installation Information" for a User Product means any methods,+procedures, authorization keys, or other information required to install+and execute modified versions of a covered work in that User Product from+a modified version of its Corresponding Source.  The information must+suffice to ensure that the continued functioning of the modified object+code is in no case prevented or interfered with solely because+modification has been made.++  If you convey an object code work under this section in, or with, or+specifically for use in, a User Product, and the conveying occurs as+part of a transaction in which the right of possession and use of the+User Product is transferred to the recipient in perpetuity or for a+fixed term (regardless of how the transaction is characterized), the+Corresponding Source conveyed under this section must be accompanied+by the Installation Information.  But this requirement does not apply+if neither you nor any third party retains the ability to install+modified object code on the User Product (for example, the work has+been installed in ROM).++  The requirement to provide Installation Information does not include a+requirement to continue to provide support service, warranty, or updates+for a work that has been modified or installed by the recipient, or for+the User Product in which it has been modified or installed.  Access to a+network may be denied when the modification itself materially and+adversely affects the operation of the network or violates the rules and+protocols for communication across the network.++  Corresponding Source conveyed, and Installation Information provided,+in accord with this section must be in a format that is publicly+documented (and with an implementation available to the public in+source code form), and must require no special password or key for+unpacking, reading or copying.++  7. Additional Terms.++  "Additional permissions" are terms that supplement the terms of this+License by making exceptions from one or more of its conditions.+Additional permissions that are applicable to the entire Program shall+be treated as though they were included in this License, to the extent+that they are valid under applicable law.  If additional permissions+apply only to part of the Program, that part may be used separately+under those permissions, but the entire Program remains governed by+this License without regard to the additional permissions.++  When you convey a copy of a covered work, you may at your option+remove any additional permissions from that copy, or from any part of+it.  (Additional permissions may be written to require their own+removal in certain cases when you modify the work.)  You may place+additional permissions on material, added by you to a covered work,+for which you have or can give appropriate copyright permission.++  Notwithstanding any other provision of this License, for material you+add to a covered work, you may (if authorized by the copyright holders of+that material) supplement the terms of this License with terms:++    a) Disclaiming warranty or limiting liability differently from the+    terms of sections 15 and 16 of this License; or++    b) Requiring preservation of specified reasonable legal notices or+    author attributions in that material or in the Appropriate Legal+    Notices displayed by works containing it; or++    c) Prohibiting misrepresentation of the origin of that material, or+    requiring that modified versions of such material be marked in+    reasonable ways as different from the original version; or++    d) Limiting the use for publicity purposes of names of licensors or+    authors of the material; or++    e) Declining to grant rights under trademark law for use of some+    trade names, trademarks, or service marks; or++    f) Requiring indemnification of licensors and authors of that+    material by anyone who conveys the material (or modified versions of+    it) with contractual assumptions of liability to the recipient, for+    any liability that these contractual assumptions directly impose on+    those licensors and authors.++  All other non-permissive additional terms are considered "further+restrictions" within the meaning of section 10.  If the Program as you+received it, or any part of it, contains a notice stating that it is+governed by this License along with a term that is a further+restriction, you may remove that term.  If a license document contains+a further restriction but permits relicensing or conveying under this+License, you may add to a covered work material governed by the terms+of that license document, provided that the further restriction does+not survive such relicensing or conveying.++  If you add terms to a covered work in accord with this section, you+must place, in the relevant source files, a statement of the+additional terms that apply to those files, or a notice indicating+where to find the applicable terms.++  Additional terms, permissive or non-permissive, may be stated in the+form of a separately written license, or stated as exceptions;+the above requirements apply either way.++  8. Termination.++  You may not propagate or modify a covered work except as expressly+provided under this License.  Any attempt otherwise to propagate or+modify it is void, and will automatically terminate your rights under+this License (including any patent licenses granted under the third+paragraph of section 11).++  However, if you cease all violation of this License, then your+license from a particular copyright holder is reinstated (a)+provisionally, unless and until the copyright holder explicitly and+finally terminates your license, and (b) permanently, if the copyright+holder fails to notify you of the violation by some reasonable means+prior to 60 days after the cessation.++  Moreover, your license from a particular copyright holder is+reinstated permanently if the copyright holder notifies you of the+violation by some reasonable means, this is the first time you have+received notice of violation of this License (for any work) from that+copyright holder, and you cure the violation prior to 30 days after+your receipt of the notice.++  Termination of your rights under this section does not terminate the+licenses of parties who have received copies or rights from you under+this License.  If your rights have been terminated and not permanently+reinstated, you do not qualify to receive new licenses for the same+material under section 10.++  9. Acceptance Not Required for Having Copies.++  You are not required to accept this License in order to receive or+run a copy of the Program.  Ancillary propagation of a covered work+occurring solely as a consequence of using peer-to-peer transmission+to receive a copy likewise does not require acceptance.  However,+nothing other than this License grants you permission to propagate or+modify any covered work.  These actions infringe copyright if you do+not accept this License.  Therefore, by modifying or propagating a+covered work, you indicate your acceptance of this License to do so.++  10. Automatic Licensing of Downstream Recipients.++  Each time you convey a covered work, the recipient automatically+receives a license from the original licensors, to run, modify and+propagate that work, subject to this License.  You are not responsible+for enforcing compliance by third parties with this License.++  An "entity transaction" is a transaction transferring control of an+organization, or substantially all assets of one, or subdividing an+organization, or merging organizations.  If propagation of a covered+work results from an entity transaction, each party to that+transaction who receives a copy of the work also receives whatever+licenses to the work the party's predecessor in interest had or could+give under the previous paragraph, plus a right to possession of the+Corresponding Source of the work from the predecessor in interest, if+the predecessor has it or can get it with reasonable efforts.++  You may not impose any further restrictions on the exercise of the+rights granted or affirmed under this License.  For example, you may+not impose a license fee, royalty, or other charge for exercise of+rights granted under this License, and you may not initiate litigation+(including a cross-claim or counterclaim in a lawsuit) alleging that+any patent claim is infringed by making, using, selling, offering for+sale, or importing the Program or any portion of it.++  11. Patents.++  A "contributor" is a copyright holder who authorizes use under this+License of the Program or a work on which the Program is based.  The+work thus licensed is called the contributor's "contributor version".++  A contributor's "essential patent claims" are all patent claims+owned or controlled by the contributor, whether already acquired or+hereafter acquired, that would be infringed by some manner, permitted+by this License, of making, using, or selling its contributor version,+but do not include claims that would be infringed only as a+consequence of further modification of the contributor version.  For+purposes of this definition, "control" includes the right to grant+patent sublicenses in a manner consistent with the requirements of+this License.++  Each contributor grants you a non-exclusive, worldwide, royalty-free+patent license under the contributor's essential patent claims, to+make, use, sell, offer for sale, import and otherwise run, modify and+propagate the contents of its contributor version.++  In the following three paragraphs, a "patent license" is any express+agreement or commitment, however denominated, not to enforce a patent+(such as an express permission to practice a patent or covenant not to+sue for patent infringement).  To "grant" such a patent license to a+party means to make such an agreement or commitment not to enforce a+patent against the party.++  If you convey a covered work, knowingly relying on a patent license,+and the Corresponding Source of the work is not available for anyone+to copy, free of charge and under the terms of this License, through a+publicly available network server or other readily accessible means,+then you must either (1) cause the Corresponding Source to be so+available, or (2) arrange to deprive yourself of the benefit of the+patent license for this particular work, or (3) arrange, in a manner+consistent with the requirements of this License, to extend the patent+license to downstream recipients.  "Knowingly relying" means you have+actual knowledge that, but for the patent license, your conveying the+covered work in a country, or your recipient's use of the covered work+in a country, would infringe one or more identifiable patents in that+country that you have reason to believe are valid.++  If, pursuant to or in connection with a single transaction or+arrangement, you convey, or propagate by procuring conveyance of, a+covered work, and grant a patent license to some of the parties+receiving the covered work authorizing them to use, propagate, modify+or convey a specific copy of the covered work, then the patent license+you grant is automatically extended to all recipients of the covered+work and works based on it.++  A patent license is "discriminatory" if it does not include within+the scope of its coverage, prohibits the exercise of, or is+conditioned on the non-exercise of one or more of the rights that are+specifically granted under this License.  You may not convey a covered+work if you are a party to an arrangement with a third party that is+in the business of distributing software, under which you make payment+to the third party based on the extent of your activity of conveying+the work, and under which the third party grants, to any of the+parties who would receive the covered work from you, a discriminatory+patent license (a) in connection with copies of the covered work+conveyed by you (or copies made from those copies), or (b) primarily+for and in connection with specific products or compilations that+contain the covered work, unless you entered into that arrangement,+or that patent license was granted, prior to 28 March 2007.++  Nothing in this License shall be construed as excluding or limiting+any implied license or other defenses to infringement that may+otherwise be available to you under applicable patent law.++  12. No Surrender of Others' Freedom.++  If conditions are imposed on you (whether by court order, agreement or+otherwise) that contradict the conditions of this License, they do not+excuse you from the conditions of this License.  If you cannot convey a+covered work so as to satisfy simultaneously your obligations under this+License and any other pertinent obligations, then as a consequence you may+not convey it at all.  For example, if you agree to terms that obligate you+to collect a royalty for further conveying from those to whom you convey+the Program, the only way you could satisfy both those terms and this+License would be to refrain entirely from conveying the Program.++  13. Use with the GNU Affero General Public License.++  Notwithstanding any other provision of this License, you have+permission to link or combine any covered work with a work licensed+under version 3 of the GNU Affero General Public License into a single+combined work, and to convey the resulting work.  The terms of this+License will continue to apply to the part which is the covered work,+but the special requirements of the GNU Affero General Public License,+section 13, concerning interaction through a network will apply to the+combination as such.++  14. Revised Versions of this License.++  The Free Software Foundation may publish revised and/or new versions of+the GNU General Public License from time to time.  Such new versions will+be similar in spirit to the present version, but may differ in detail to+address new problems or concerns.++  Each version is given a distinguishing version number.  If the+Program specifies that a certain numbered version of the GNU General+Public License "or any later version" applies to it, you have the+option of following the terms and conditions either of that numbered+version or of any later version published by the Free Software+Foundation.  If the Program does not specify a version number of the+GNU General Public License, you may choose any version ever published+by the Free Software Foundation.++  If the Program specifies that a proxy can decide which future+versions of the GNU General Public License can be used, that proxy's+public statement of acceptance of a version permanently authorizes you+to choose that version for the Program.++  Later license versions may give you additional or different+permissions.  However, no additional obligations are imposed on any+author or copyright holder as a result of your choosing to follow a+later version.++  15. Disclaimer of Warranty.++  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.++  16. Limitation of Liability.++  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF+SUCH DAMAGES.++  17. Interpretation of Sections 15 and 16.++  If the disclaimer of warranty and limitation of liability provided+above cannot be given local legal effect according to their terms,+reviewing courts shall apply local law that most closely approximates+an absolute waiver of all civil liability in connection with the+Program, unless a warranty or assumption of liability accompanies a+copy of the Program in return for a fee.++                     END OF TERMS AND CONDITIONS++            How to Apply These Terms to Your New Programs++  If you develop a new program, and you want it to be of the greatest+possible use to the public, the best way to achieve this is to make it+free software which everyone can redistribute and change under these terms.++  To do so, attach the following notices to the program.  It is safest+to attach them to the start of each source file to most effectively+state the exclusion of warranty; and each file should have at least+the "copyright" line and a pointer to where the full notice is found.++    <one line to give the program's name and a brief idea of what it does.>+    Copyright (C) <year>  <name of author>++    This program is free software: you can redistribute it and/or modify+    it under the terms of the GNU General Public License as published by+    the Free Software Foundation, either version 3 of the License, or+    (at your option) any later version.++    This program is distributed in the hope that it will be useful,+    but WITHOUT ANY WARRANTY; without even the implied warranty of+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the+    GNU General Public License for more details.++    You should have received a copy of the GNU General Public License+    along with this program.  If not, see <http://www.gnu.org/licenses/>.++Also add information on how to contact you by electronic and paper mail.++  If the program does terminal interaction, make it output a short+notice like this when it starts in an interactive mode:++    <program>  Copyright (C) <year>  <name of author>+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.+    This is free software, and you are welcome to redistribute it+    under certain conditions; type `show c' for details.++The hypothetical commands `show w' and `show c' should show the appropriate+parts of the General Public License.  Of course, your program's commands+might be different; for a GUI interface, you would use an "about box".++  You should also get your employer (if you work as a programmer) or school,+if any, to sign a "copyright disclaimer" for the program, if necessary.+For more information on this, and how to apply and follow the GNU GPL, see+<http://www.gnu.org/licenses/>.++  The GNU General Public License does not permit incorporating your program+into proprietary programs.  If your program is a subroutine library, you+may consider it more useful to permit linking proprietary applications with+the library.  If this is what you want to do, use the GNU Lesser General+Public License instead of this License.  But first, please read+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+ Setup.lhs view
@@ -0,0 +1,4 @@+#! /usr/bin/env runhaskell++> import Distribution.Simple+> main = defaultMain
+ changelog.md view
@@ -0,0 +1,6 @@+2009.4.30+----------++### Feature++Init
+ hack-contrib.cabal view
@@ -0,0 +1,42 @@+Name:                 hack-contrib+Version:              2009.4.30+Build-type:           Simple+Synopsis:             Hack contrib+Description:+License:              GPL+License-file:         LICENSE+Author:               Wang, Jinjing+Maintainer:           Wang, Jinjing <nfjinjing@gmail.com>+Build-Depends:        base+Cabal-version:        >= 1.2+category:             Web+homepage:             http://github.com/nfjinjing/hack/tree/master+data-files:           readme.md, changelog.md++library+  ghc-options: -Wall+  build-depends: base, cgi, network, haskell98, old-locale, old-time, directory, filepath, containers, bytestring, template, base64-string, zlib, ansi-wl-pprint, mps >= 2009.4.21, data-default >= 0.2, ansi-wl-pprint, unix, time, hack >= 2009.4.30+  hs-source-dirs: src/+  exposed-modules:  +                    Hack.Contrib.Utils+                    Hack.Contrib.Request+                    Hack.Contrib.Response+                    Hack.Contrib.Constants+                    +                    Hack.Contrib.Middleware.ContentSize+                    Hack.Contrib.Middleware.ContentType+                    Hack.Contrib.Middleware.File+                    Hack.Contrib.Middleware.Head+                    Hack.Contrib.Middleware.Hub+                    Hack.Contrib.Middleware.Lambda+                    Hack.Contrib.Middleware.Lucky+                    Hack.Contrib.Middleware.Mime+                    Hack.Contrib.Middleware.RawRouter+                    Hack.Contrib.Middleware.ShowExceptions+                    Hack.Contrib.Middleware.ShowStatus+                    Hack.Contrib.Middleware.SimpleAccessLogger+                    Hack.Contrib.Middleware.SimpleRouter+                    Hack.Contrib.Middleware.Static++                    +                    
+ readme.md view
@@ -0,0 +1,1 @@+Middleware and Helper for Hack
+ src/Hack/Contrib/Constants.hs view
@@ -0,0 +1,171 @@+module Hack.Contrib.Constants where++import MPS+import Prelude hiding ((.))+import Data.Map++status_with_no_entity_body :: [Int]+status_with_no_entity_body = [100 .. 199] ++ [204, 304]+++-- header constants+_CacheControl                   :: String+_Connection                     :: String+_Date                           :: String+_Pragma                         :: String+_TransferEncoding               :: String+_Upgrade                        :: String+_Via                            :: String+_Accept                         :: String+_AcceptCharset                  :: String+_AcceptEncoding                 :: String+_AcceptLanguage                 :: String+_Authorization                  :: String+_Cookie                         :: String+_Expect                         :: String+_From                           :: String+_Host                           :: String+_IfModifiedSince                :: String+_IfMatch                        :: String+_IfNoneMatch                    :: String+_IfRange                        :: String+_IfUnmodifiedSince              :: String+_MaxForwards                    :: String+_ProxyAuthorization             :: String+_Range                          :: String+_Referer                        :: String+_UserAgent                      :: String+_Age                            :: String+_Location                       :: String+_ProxyAuthenticate              :: String+_Public                         :: String+_RetryAfter                     :: String+_Server                         :: String+_SetCookie                      :: String+_TE                             :: String+_Trailer                        :: String+_Vary                           :: String+_Warning                        :: String+_WWWAuthenticate                :: String+_Allow                          :: String+_ContentBase                    :: String+_ContentEncoding                :: String+_ContentLanguage                :: String+_ContentLength                  :: String+_ContentLocation                :: String+_ContentMD5                     :: String+_ContentRange                   :: String+_ContentType                    :: String+_ETag                           :: String+_Expires                        :: String+_LastModified                   :: String+_ContentTransferEncoding        :: String++++_CacheControl                   =  "Cache-Control"        +_Connection                     =  "Connection"           +_Date                           =  "Date"                 +_Pragma                         =  "Pragma"               +_TransferEncoding               =  "Transfer-Encoding"    +_Upgrade                        =  "Upgrade"              +_Via                            =  "Via"                  +_Accept                         =  "Accept"               +_AcceptCharset                  =  "Accept-Charset"       +_AcceptEncoding                 =  "Accept-Encoding"      +_AcceptLanguage                 =  "Accept-Language"      +_Authorization                  =  "Authorization"        +_Cookie                         =  "Cookie"               +_Expect                         =  "Expect"               +_From                           =  "From"                 +_Host                           =  "Host"                 +_IfModifiedSince                =  "If-Modified-Since"    +_IfMatch                        =  "If-Match"             +_IfNoneMatch                    =  "If-None-Match"        +_IfRange                        =  "If-Range"             +_IfUnmodifiedSince              =  "If-Unmodified-Since"  +_MaxForwards                    =  "Max-Forwards"         +_ProxyAuthorization             =  "Proxy-Authorization"  +_Range                          =  "Range"                +_Referer                        =  "Referer"              +_UserAgent                      =  "User-Agent"           +_Age                            =  "Age"                  +_Location                       =  "Location"             +_ProxyAuthenticate              =  "Proxy-Authenticate"   +_Public                         =  "Public"               +_RetryAfter                     =  "Retry-After"          +_Server                         =  "Server"               +_SetCookie                      =  "Set-Cookie"           +_TE                             =  "TE"                   +_Trailer                        =  "Trailer"              +_Vary                           =  "Vary"                 +_Warning                        =  "Warning"              +_WWWAuthenticate                =  "WWW-Authenticate"     +_Allow                          =  "Allow"                +_ContentBase                    =  "Content-Base"         +_ContentEncoding                =  "Content-Encoding"     +_ContentLanguage                =  "Content-Language"     +_ContentLength                  =  "Content-Length"       +_ContentLocation                =  "Content-Location"     +_ContentMD5                     =  "Content-MD5"          +_ContentRange                   =  "Content-Range"        +_ContentType                    =  "Content-Type"         +_ETag                           =  "ETag"                 +_Expires                        =  "Expires"              +_LastModified                   =  "Last-Modified"        +_ContentTransferEncoding        =  "Content-Transfer-Encodeing"+++-- mime type+_TextPlain :: String+_TextHtml  :: String++_TextPlain  = "text/plain"+_TextHtml   = "text/html"+++-- status code+status_code :: Map Int String+status_code =+  [  x       100          "Continue"+  ,  x       101          "Switching Protocols"+  ,  x       200          "OK"+  ,  x       201          "Created"+  ,  x       202          "Accepted"+  ,  x       203          "Non-Authoritative Information"+  ,  x       204          "No Content"+  ,  x       205          "Reset Content"+  ,  x       206          "Partial Content"+  ,  x       300          "Multiple Choices"+  ,  x       301          "Moved Permanently"+  ,  x       302          "Found"+  ,  x       303          "See Other"+  ,  x       304          "Not Modified"+  ,  x       305          "Use Proxy"+  ,  x       307          "Temporary Redirect"+  ,  x       400          "Bad Request"+  ,  x       401          "Unauthorized"+  ,  x       402          "Payment Required"+  ,  x       403          "Forbidden"+  ,  x       404          "Not Found"+  ,  x       405          "Method Not Allowed"+  ,  x       406          "Not Acceptable"+  ,  x       407          "Proxy Authentication Required"+  ,  x       408          "Request Timeout"+  ,  x       409          "Conflict"+  ,  x       410          "Gone"+  ,  x       411          "Length Required"+  ,  x       412          "Precondition Failed"+  ,  x       413          "Request Entity Too Large"+  ,  x       414          "Request-URI Too Large"+  ,  x       415          "Unsupported Media Type"+  ,  x       416          "Requested Range Not Satisfiable"+  ,  x       417          "Expectation Failed"+  ,  x       500          "Internal Server Error"+  ,  x       501          "Not Implemented"+  ,  x       502          "Bad Gateway"+  ,  x       503          "Service Unavailable"+  ,  x       504          "Gateway Timeout"+  ,  x       505          "HTTP Version Not Supported"+  ] .to_h+  where x a b = (a, b)
+ src/Hack/Contrib/Middleware/ContentSize.hs view
@@ -0,0 +1,25 @@+module Hack.Contrib.Middleware.ContentSize (content_size) where++import Hack+import Hack.Contrib.Utils+import Hack.Contrib.Response+import Hack.Contrib.Constants++import MPSUTF8+import Prelude hiding ((.), (^), (>))++content_size :: Middleware+content_size app = \env -> do+  response <- app env+  +  if should_size response+    then response+      .set_header _ContentLength (response.body.bytesize.show) .return+    else response .return+  +  where +    should_size response =+      [  not $ response.has_header _ContentLength+      ,  not $ response.has_header _TransferEncoding+      ,  not $ status_with_no_entity_body.has(response.status)+      ] .and
+ src/Hack/Contrib/Middleware/ContentType.hs view
@@ -0,0 +1,17 @@+module Hack.Contrib.Middleware.ContentType (content_type) where++import Hack+import Hack.Contrib.Response+import Hack.Contrib.Constants++import MPSUTF8+import Prelude hiding ((.), (^), (>))+++content_type :: String -> Middleware+content_type s app = \env -> do+  response <- app env+  +  case response.header _ContentType of+    Nothing -> response.set_header _ContentType s .return+    Just _ -> response .return
+ src/Hack/Contrib/Middleware/File.hs view
@@ -0,0 +1,92 @@+module Hack.Contrib.Middleware.File (file) where++import Hack+import Hack.Contrib.Utils+import Hack.Contrib.Response+import Hack.Contrib.Constants+import Hack.Contrib.Middleware.Mime++import MPSUTF8+import Prelude hiding ((.), (^), (>), (+), (/), readFile)++import Data.Default+import Data.Maybe+import Data.List (isInfixOf)+import System.Directory+import System.FilePath+++file :: Maybe String -> Middleware+file root _ = \env -> do+  let path = env.path_info .url2unicode+  +  if ".." `isInfixOf` path +    then forbidden+    else serve root path env+++serve :: Maybe String -> FilePath -> Env -> IO Response+serve root fname _ = do+  cwd <- get_current_directory+  let my_root = root.fromMaybe cwd+  let path = my_root / makeRelative "/" fname+  +  exist <- file_exist path++  if not exist+      then path.not_found+      else+        do +          can_read <- path.get_permissions ^ readable+          if not can_read+            then path.no_permission+            else path.serving+    +    where +      serving path = do+        content <- path.read_binary_file+        size <- file_size path ^ from_i+        mtime_str <- file_mtime path ^ httpdate+        +        let default_content_type = "application/octet-stream"+        let safe_lookup = lookup_mime_type > fromMaybe default_content_type+        let content_type = path.takeExtension.safe_lookup+        +        return $ +          def +            .set_body content+            .set_content_length size+            .set_content_type content_type+            .set_last_modified mtime_str+            .set_status 200++no_permission :: String -> IO Response+no_permission path = return $+  def+    .set_status 404+    .set_content_type _TextPlain+    .set_content_length (msg.length)+    .set_body msg++  where msg = "No permission: " ++ path ++ "\n"++not_found :: String -> IO Response+not_found path = return $+  def+    .set_status 404+    .set_content_type _TextPlain+    .set_content_length (msg.length)+    .set_body msg+  +  where msg = "File not found: " ++ path ++ "\n"++forbidden :: IO Response+forbidden = return $ +  def+    .set_status 403+    .set_content_type _TextPlain+    .set_content_length (msg.length)+    .set_body msg++  where msg = "Forbidden\n"+  
+ src/Hack/Contrib/Middleware/Head.hs view
@@ -0,0 +1,14 @@+module Hack.Contrib.Middleware.Head (head) where++import Hack+import Hack.Contrib.Response++import MPSUTF8+import Prelude hiding ((.), (^), (>), head)++head :: Middleware+head app = \env -> do+  response <- app env+  if env.request_method.is HEAD +    then return $ response .set_body "" .set_content_length 0+    else return $ response
+ src/Hack/Contrib/Middleware/Hub.hs view
@@ -0,0 +1,74 @@+{-# LANGUAGE QuasiQuotes #-}++-- the entire logging framework is stole from [innate](http://github.com/manveru/innate/tree/master)+++module Hack.Contrib.Middleware.Hub where++import Hack+import Hack.Contrib.Utils++import MPSUTF8+import Prelude hiding ((.), (^), (>), (+))++import Text.Printf+import System.Posix.Process (getProcessID)+import Data.Maybe+import Text.PrettyPrint.ANSI.Leijen+import Data.Time++data Severity = +     Debug+  |  Info+  |  Warn+  |  Error+  |  Fatal+  |  Unknown+  deriving (Show, Eq)++hint :: Severity -> String+hint = show > slice 0 1++type Formatter = Severity -> UTCTime -> Int -> String -> String -> String++type Logger = String -> Severity -> IO ()++hub :: Stream -> Formatter -> String -> Logger+hub stream formatter program = \message severity -> +  do+    time <- now+    pid <- getProcessID ^ from_i+    stream $ formatter severity time pid program message++simple_logger :: Stream -> String -> Logger+simple_logger = flip hub simple_formatter++simple_formatter :: Formatter+simple_formatter severity time pid program message =+  printf line_format h t pid l program s+  +  where+    line_format = "%s [%s $%d] %5s | %-25s: %s\n"+    +    h = severity.hint+    +    time_format = "%Y-%m-%d %H:%M:%S"+    t = time.format_time time_format+    +    l = severity.show.upper+    s = colorize severity message++colorize :: Severity -> String -> String+colorize severity message = color severity (message.text) .show+  where+    level_color = +      [ (   Debug           , blue    )+      , (   Info            , white   )+      , (   Warn            , yellow  )+      , (   Error           , red     )+      , (   Fatal           , red     )+      , (   Unknown         , green   )+      ]+    +    color severity' = level_color.lookup severity' .fromMaybe green+
+ src/Hack/Contrib/Middleware/Lambda.hs view
@@ -0,0 +1,47 @@+{-# LANGUAGE QuasiQuotes #-}++module Hack.Contrib.Middleware.Lambda (lambda) where++import Hack+import Hack.Contrib.Response+import Hack.Contrib.Utils+import Hack.Contrib.Constants++import MPSUTF8+import Prelude hiding ((.), (^), (>), (+))+import Data.Default++data64 :: String+data64 = [$here|++H4sIAAAAAAAAA+3dMVMbMRQE4J5foaGhpMhMCkP4LcpknCrBN0BB/n1yIbHkRNKd+pPe0j7vdjsa6/cYbjAm+++np6J5ffnw7frr+enp8ObiP0+vth+nVfT89np6nz1+O+d9cPXiQOHJESVyKPgqaQwRCxQEPMEaghYYFmeEt/DwELNMLfGLBAE4TALdAAccAW+6PqXgVqgy/8TpAW6+3+hRRSYBbp4KiALdO1kMBbo1pnQIgrAAl05n+EW6MKF0CLK+YAt03XJoETLUAl12KQMt0FUXQ4sowyzQRVeEFlEGWaBrrgotogyxQJdcGVpEGWCB+rrg6tIiiboEuWBFaRKFFiLIFul5VaBGFFiGqFuhylaFFFFqEKFqgq1WHFlFoEaJm+gS7WEFpEoUUILUKULNqv5+acX1/dnSNWuHS2MQsXLOYHOVschPqWYs7CXTwxDkaf+GIMsgCsxZwFciYpF3yXBVmLQArYSgxawlVi0gK3EogVqJRYtLp8Y41Zi0gK0EpsW+hZXcJNN/pLNqUVrJu7IQua78SvzuLCpXInOmUYvKlYgcadaibiUiJ9q1GP+Ky67F++Fdc78JifsgBTwy7FrmN6GHYtcj825n+XiJyolmL3ELS30tEjrRqkV9I8hWXzJlG+LfILSa5E5EwFCy9wWaWFpFYicKRVi/JCEivpP9JZtcgsRPkVl0mLzEIOyu9xWbQo+/SSi+YrLokV2IXMUV2LQIr+QOYorsWex9LO62krWF7Tzu2WtlahY+J4rKi9kjtZK+zFmseTdLaSXmLBYXMkdnJdYslhcyR2clxizWvt+rsZKKfvy/rrSgxb4taurxb2lo+QYtdW1S149+n0mJ/FnXl+DkHtJCw8Oh6NamsRot9WNRW42eN7cKiuhk/m5AWQhYe+XXJd6nvRos/Co2uuSUMtWnRaeHTR5bS02qhFUyveW2HrFm2leP+RfguPrltKY6Ut+WrRW4j29JCw8unIuzYW2Z9FeaHP3hgRZeHTtVDrqbM2ip87G7qvb1WZb956GWnh0++cv0deG96gUtPBogpLfJhiy6m/RbeLTBn/QXEbDwaIXfEeghYeHRDk6EQsbCoyWc+SIur+9vp6fjwE8s/QZd0jAAA++|].strip++lambda :: Middleware+lambda app = \env -> do+  if env.path_info.is "/lambda"+    then +      return $ def+        .set_body (data64.unzip64)+        .set_content_type _TextHtml+        .set_status 200+    +    else app env
+ src/Hack/Contrib/Middleware/Lucky.hs view
@@ -0,0 +1,1173 @@+{-# LANGUAGE QuasiQuotes #-}++module Hack.Contrib.Middleware.Lucky (lucky) where++import Hack+import Hack.Contrib.Response+import Hack.Contrib.Utils+import Hack.Contrib.Constants++import MPSUTF8+import Prelude hiding ((.), (^), (>), (+))+import Data.Default++lucky :: Middleware+lucky app = \env -> do+  if env.path_info.is "/lucky"+    then +      return $ def+      .set_body (data64.unzip64)+      .set_content_type _TextHtml+      .set_status 200+    +    else app env++data64 :: String+data64 = [$here|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|]
+ src/Hack/Contrib/Middleware/Mime.hs view
@@ -0,0 +1,178 @@+module Hack.Contrib.Middleware.Mime where++import qualified Data.Map as M+import MPSUTF8+import Prelude hiding ((.))++mime_types :: M.Map String String+mime_types = +   [  x     ".3gp"          "video/3gpp"+   ,  x     ".a"            "application/octet-stream"+   ,  x     ".ai"           "application/postscript"+   ,  x     ".aif"          "audio/x-aiff"+   ,  x     ".aiff"         "audio/x-aiff"+   ,  x     ".asc"          "application/pgp-signature"+   ,  x     ".asf"          "video/x-ms-asf"+   ,  x     ".asm"          "text/x-asm"+   ,  x     ".asx"          "video/x-ms-asf"+   ,  x     ".atom"         "application/atom+xml"+   ,  x     ".au"           "audio/basic"+   ,  x     ".avi"          "video/x-msvideo"+   ,  x     ".bat"          "application/x-msdownload"+   ,  x     ".bin"          "application/octet-stream"+   ,  x     ".bmp"          "image/bmp"+   ,  x     ".bz2"          "application/x-bzip2"+   ,  x     ".c"            "text/x-c"+   ,  x     ".cab"          "application/vnd.ms-cab-compressed"+   ,  x     ".cc"           "text/x-c"+   ,  x     ".chm"          "application/vnd.ms-htmlhelp"+   ,  x     ".class"        "application/octet-stream"+   ,  x     ".com"          "application/x-msdownload"+   ,  x     ".conf"         "text/plain"+   ,  x     ".cpp"          "text/x-c"+   ,  x     ".crt"          "application/x-x509-ca-cert"+   ,  x     ".css"          "text/css"+   ,  x     ".csv"          "text/csv"+   ,  x     ".cxx"          "text/x-c"+   ,  x     ".deb"          "application/x-debian-package"+   ,  x     ".der"          "application/x-x509-ca-cert"+   ,  x     ".diff"         "text/x-diff"+   ,  x     ".djv"          "image/vnd.djvu"+   ,  x     ".djvu"         "image/vnd.djvu"+   ,  x     ".dll"          "application/x-msdownload"+   ,  x     ".dmg"          "application/octet-stream"+   ,  x     ".doc"          "application/msword"+   ,  x     ".dot"          "application/msword"+   ,  x     ".dtd"          "application/xml-dtd"+   ,  x     ".dvi"          "application/x-dvi"+   ,  x     ".ear"          "application/java-archive"+   ,  x     ".eml"          "message/rfc822"+   ,  x     ".eps"          "application/postscript"+   ,  x     ".exe"          "application/x-msdownload"+   ,  x     ".f"            "text/x-fortran"+   ,  x     ".f77"          "text/x-fortran"+   ,  x     ".f90"          "text/x-fortran"+   ,  x     ".flv"          "video/x-flv"+   ,  x     ".for"          "text/x-fortran"+   ,  x     ".gem"          "application/octet-stream"+   ,  x     ".gemspec"      "text/x-script.ruby"+   ,  x     ".gif"          "image/gif"+   ,  x     ".gz"           "application/x-gzip"+   ,  x     ".h"            "text/x-c"+   ,  x     ".hh"           "text/x-c"+   ,  x     ".htm"          "text/html"+   ,  x     ".html"         "text/html"+   ,  x     ".ico"          "image/vnd.microsoft.icon"+   ,  x     ".ics"          "text/calendar"+   ,  x     ".ifb"          "text/calendar"+   ,  x     ".iso"          "application/octet-stream"+   ,  x     ".jar"          "application/java-archive"+   ,  x     ".java"         "text/x-java-source"+   ,  x     ".jnlp"         "application/x-java-jnlp-file"+   ,  x     ".jpeg"         "image/jpeg"+   ,  x     ".jpg"          "image/jpeg"+   ,  x     ".js"           "application/javascript"+   ,  x     ".json"         "application/json"+   ,  x     ".log"          "text/plain"+   ,  x     ".m3u"          "audio/x-mpegurl"+   ,  x     ".m4v"          "video/mp4"+   ,  x     ".man"          "text/troff"+   ,  x     ".mathml"       "application/mathml+xml"+   ,  x     ".mbox"         "application/mbox"+   ,  x     ".mdoc"         "text/troff"+   ,  x     ".me"           "text/troff"+   ,  x     ".mid"          "audio/midi"+   ,  x     ".midi"         "audio/midi"+   ,  x     ".mime"         "message/rfc822"+   ,  x     ".mml"          "application/mathml+xml"+   ,  x     ".mng"          "video/x-mng"+   ,  x     ".mov"          "video/quicktime"+   ,  x     ".mp3"          "audio/mpeg"+   ,  x     ".mp4"          "video/mp4"+   ,  x     ".mp4v"         "video/mp4"+   ,  x     ".mpeg"         "video/mpeg"+   ,  x     ".mpg"          "video/mpeg"+   ,  x     ".ms"           "text/troff"+   ,  x     ".msi"          "application/x-msdownload"+   ,  x     ".odp"          "application/vnd.oasis.opendocument.presentation"+   ,  x     ".ods"          "application/vnd.oasis.opendocument.spreadsheet"+   ,  x     ".odt"          "application/vnd.oasis.opendocument.text"+   ,  x     ".ogg"          "application/ogg"+   ,  x     ".p"            "text/x-pascal"+   ,  x     ".pas"          "text/x-pascal"+   ,  x     ".pbm"          "image/x-portable-bitmap"+   ,  x     ".pdf"          "application/pdf"+   ,  x     ".pem"          "application/x-x509-ca-cert"+   ,  x     ".pgm"          "image/x-portable-graymap"+   ,  x     ".pgp"          "application/pgp-encrypted"+   ,  x     ".pkg"          "application/octet-stream"+   ,  x     ".pl"           "text/x-script.perl"+   ,  x     ".pm"           "text/x-script.perl-module"+   ,  x     ".png"          "image/png"+   ,  x     ".pnm"          "image/x-portable-anymap"+   ,  x     ".ppm"          "image/x-portable-pixmap"+   ,  x     ".pps"          "application/vnd.ms-powerpoint"+   ,  x     ".ppt"          "application/vnd.ms-powerpoint"+   ,  x     ".ps"           "application/postscript"+   ,  x     ".psd"          "image/vnd.adobe.photoshop"+   ,  x     ".py"           "text/x-script.python"+   ,  x     ".qt"           "video/quicktime"+   ,  x     ".ra"           "audio/x-pn-realaudio"+   ,  x     ".rake"         "text/x-script.ruby"+   ,  x     ".ram"          "audio/x-pn-realaudio"+   ,  x     ".rar"          "application/x-rar-compressed"+   ,  x     ".rb"           "text/x-script.ruby"+   ,  x     ".rdf"          "application/rdf+xml"+   ,  x     ".roff"         "text/troff"+   ,  x     ".rpm"          "application/x-redhat-package-manager"+   ,  x     ".rss"          "application/rss+xml"+   ,  x     ".rtf"          "application/rtf"+   ,  x     ".ru"           "text/x-script.ruby"+   ,  x     ".s"            "text/x-asm"+   ,  x     ".sgm"          "text/sgml"+   ,  x     ".sgml"         "text/sgml"+   ,  x     ".sh"           "application/x-sh"+   ,  x     ".sig"          "application/pgp-signature"+   ,  x     ".snd"          "audio/basic"+   ,  x     ".so"           "application/octet-stream"+   ,  x     ".svg"          "image/svg+xml"+   ,  x     ".svgz"         "image/svg+xml"+   ,  x     ".swf"          "application/x-shockwave-flash"+   ,  x     ".t"            "text/troff"+   ,  x     ".tar"          "application/x-tar"+   ,  x     ".tbz"          "application/x-bzip-compressed-tar"+   ,  x     ".tcl"          "application/x-tcl"+   ,  x     ".tex"          "application/x-tex"+   ,  x     ".texi"         "application/x-texinfo"+   ,  x     ".texinfo"      "application/x-texinfo"+   ,  x     ".text"         "text/plain"+   ,  x     ".tif"          "image/tiff"+   ,  x     ".tiff"         "image/tiff"+   ,  x     ".torrent"      "application/x-bittorrent"+   ,  x     ".tr"           "text/troff"+   ,  x     ".txt"          "text/plain"+   ,  x     ".vcf"          "text/x-vcard"+   ,  x     ".vcs"          "text/x-vcalendar"+   ,  x     ".vrml"         "model/vrml"+   ,  x     ".war"          "application/java-archive"+   ,  x     ".wav"          "audio/x-wav"+   ,  x     ".wma"          "audio/x-ms-wma"+   ,  x     ".wmv"          "video/x-ms-wmv"+   ,  x     ".wmx"          "video/x-ms-wmx"+   ,  x     ".wrl"          "model/vrml"+   ,  x     ".wsdl"         "application/wsdl+xml"+   ,  x     ".xbm"          "image/x-xbitmap"+   ,  x     ".xhtml"        "application/xhtml+xml"+   ,  x     ".xls"          "application/vnd.ms-excel"+   ,  x     ".xml"          "application/xml"+   ,  x     ".xpm"          "image/x-xpixmap"+   ,  x     ".xsl"          "application/xml"+   ,  x     ".xslt"         "application/xslt+xml"+   ,  x     ".yaml"         "text/yaml"+   ,  x     ".yml"          "text/yaml"+   ,  x     ".zip"          "application/zip"+   ] .to_h+   where x a b = (a, b)++lookup_mime_type :: String -> Maybe String+lookup_mime_type = flip M.lookup mime_types
+ src/Hack/Contrib/Middleware/RawRouter.hs view
@@ -0,0 +1,20 @@+module Hack.Contrib.Middleware.RawRouter (route) where++import Hack+import Hack.Contrib.Utils+import Hack.Contrib.Request hiding (path)++import MPSUTF8+import Prelude hiding ((.), (^), (>))+import List (find)+import Data.Maybe++type RoutePath = (String, Application)++route :: [RoutePath] -> Middleware+route h app = \env ->+  let path = env.fullpath+  in+  case h.find (fst > flip match path > isJust) of+    Nothing -> app env+    Just (_, found_app) -> found_app env
+ src/Hack/Contrib/Middleware/ShowExceptions.hs view
@@ -0,0 +1,31 @@+module Hack.Contrib.Middleware.ShowExceptions (show_exceptions) where++import Hack+import Hack.Contrib.Middleware.Hub++import MPSUTF8+import Prelude hiding ((.), (^), (>), log)++import Data.Maybe+import Data.Default++import System.IO  +import System.IO.Error+++program :: String+program = "ShowExceptions"++show_exceptions :: Maybe Stream -> Middleware+show_exceptions stream app = \env -> do+  let my_stream = stream.fromMaybe (env.hack_errors)+  let log = simple_logger my_stream program+  +  app env `catch` (handler log)++  where+    handler :: Logger -> IOError -> IO Response+    handler log e = do+      let message = e.show+      Error. log message+      return $ def { status = 500, body = message }
+ src/Hack/Contrib/Middleware/ShowStatus.hs view
@@ -0,0 +1,97 @@+{-# LANGUAGE QuasiQuotes #-}++module Hack.Contrib.Middleware.ShowStatus (show_status) where++import Hack+import Hack.Contrib.Utils+import Hack.Contrib.Constants+import Hack.Contrib.Request hiding (body)+import Hack.Contrib.Response++import MPSUTF8+import Prelude hiding ((.), (^), (>), head)++import Data.Maybe++show_status :: Middleware+show_status app = \env -> do+  response <- app env+  +  let content_length = response.header _ContentLength .fromMaybe "0"+  let content_empty = content_length .read .(<= (0 :: Int))+  +  if response.status >= 400 && content_empty+    then +      let +          i       = response.status+          message = i.show_status_code .fromMaybe (i.show)+          detail  = env.custom_"hack.showstatus.detail" .fromMaybe message+          result  = template message detail env response+          size    = result.bytesize+      in+      return $ +        response+          .set_body result+          .set_content_type _TextHtml+          .set_content_length size+    +    else return response+++template :: String -> String -> Env -> Response -> String+template message detail env response = +  let h = escape_html in [$here|+++<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">+<html lang="en">+<head>+  <meta http-equiv="content-type" content="text/html; charset=utf-8" />+  <title>#{h message } at #{h (env.path.url2unicode) }</title>+  <meta name="robots" content="NONE,NOARCHIVE" />+  <style type="text/css">+    html * { padding:0; margin:0; }+    body * { padding:10px 20px; }+    body * * { padding:0; }+    body { font:small sans-serif; background:#eee; }+    body>div { border-bottom:1px solid #ddd; }+    h1 { font-weight:normal; margin-bottom:.4em; }+    h1 span { font-size:60%; color:#666; font-weight:normal; }+    table { border:none; border-collapse: collapse; width:100%; }+    td, th { vertical-align:top; padding:2px 3px; }+    th { width:12em; text-align:right; color:#666; padding-right:.5em; }+    #info { background:#f6f6f6; }+    #info ol { margin: 0.5em 4em; }+    #info ol li { font-family: monospace; }+    #summary { background: #ffc; }+    #explanation { background:#eee; border-bottom: 0px none; }+  </style>+</head>+<body>+  <div id="summary">+    <h1>#{h message } <span>(#{ response.status })</span></h1>+    <table class="meta">+      <tr>+        <th>Request Method:</th>+        <td>#{ env.request_method }</td>+      </tr>+      <tr>+        <th>Request URL:</th>+      <td>#{h (env.url.url2unicode) }</td>+      </tr>+    </table>+  </div>+  <div id="info">+    <p>#{h detail }</p>+  </div>++  <div id="explanation">+    <p>+    You're seeing this error because you use <code>Hack.Contrib.Middleware.ShowStatus</code>.+    </p>+  </div>+</body>+</html>+++|]
+ src/Hack/Contrib/Middleware/SimpleAccessLogger.hs view
@@ -0,0 +1,22 @@+module Hack.Contrib.Middleware.SimpleAccessLogger (simple_access_logger) where++import Hack+import Hack.Contrib.Utils+import Hack.Contrib.Request+import Hack.Contrib.Middleware.Hub++import MPSUTF8+import Prelude hiding ((.), (^), (>), log)+import Data.Maybe++program :: String+program = "SimpleAccessLogger"++simple_access_logger :: Maybe Stream -> Middleware+simple_access_logger stream app = \env -> do+  let my_stream = stream.fromMaybe (env.hack_errors)+  let log = simple_logger my_stream program+  +  Info .log (env.url.url2unicode)+  +  app env
+ src/Hack/Contrib/Middleware/SimpleRouter.hs view
@@ -0,0 +1,25 @@+{-# LANGUAGE QuasiQuotes #-}++module Hack.Contrib.Middleware.SimpleRouter (route) where++import Hack+import Hack.Contrib.Utils++import MPSUTF8+import Prelude hiding ((.), (^), (>))+import List (find, isPrefixOf)++type RoutePath = (String, Application)++route :: [RoutePath] -> Middleware+route h app = \env ->+  let path             = env.path_info+      script           = env.script_name+      mod_env location = env +        { script_name  = script ++ location+        , path_info    = path.drop (location.length)+        }+  in+  case h.find (fst > (`isPrefixOf` path) ) of+    Nothing -> app env+    Just (location, app') -> app' (mod_env location)
+ src/Hack/Contrib/Middleware/Static.hs view
@@ -0,0 +1,22 @@+module Hack.Contrib.Middleware.Static (static) where++import Hack+import Hack.Contrib.Utils+import Hack.Contrib.Middleware.File (file)++import MPSUTF8+import Prelude hiding ((.), (^), (>), (+))+import Data.Maybe+import List (find, isPrefixOf)++static :: Maybe String -> [String] -> Middleware+static root urls app = \env -> do+  let my_urls = if urls.null then ["/favicon.ico"] else urls++  let path = env.path_info .url2unicode++  let can_serve = my_urls.find ( `isPrefixOf` path ) .isJust+  +  if can_serve+    then file root app env+    else app env
+ src/Hack/Contrib/Request.hs view
@@ -0,0 +1,53 @@+{-# LANGUAGE QuasiQuotes #-}++module Hack.Contrib.Request where++import Hack+import Prelude hiding ((.), (^), (>), lookup, (+))+import MPSUTF8+import Hack.Contrib.Utils+import List (lookup)+import Data.Maybe++body :: Env -> String+body = hack_input++scheme :: Env -> String+scheme = hack_url_scheme > show > lower++port :: Env -> Int+port = server_port++path :: Env -> String+path env = env.script_name ++ env.path_info++fullpath :: Env -> String+fullpath env = +  if env.query_string.empty +    then env.path +    else env.path ++ "?" ++ env.query_string++http_ :: String -> Env -> Maybe String+http_ s env = env.http.reverse.lookup s++custom_ :: String -> Env -> Maybe String+custom_ s env = env.custom.reverse.lookup s++host :: Env -> String+host env = env.http_"HOST" .fromMaybe (env.server_name) .gsub ":\\d+\\z" ""++url :: Env -> String+url env =+  [  env.scheme+  ,  "://"+  ,  env.host+  ,  port_string+  ,  env.fullpath+  ]+  .join'+  where+    port_string = +      if (env.scheme.is "https" && env.port.is_not 443 || +          env.scheme.is "http" && env.port.is_not 80 )+        then ":" ++ env.server_port.show+        else ""
+ src/Hack/Contrib/Response.hs view
@@ -0,0 +1,38 @@+{-# LANGUAGE QuasiQuotes #-}++module Hack.Contrib.Response where++import Hack+import Hack.Contrib.Constants++import MPSUTF8+import Prelude hiding ((.), (^), (>), (+))++import Data.Map (toList)+import Data.Maybe+++header :: String -> Response -> Maybe String+header s r = r.headers.reverse.lookup s++has_header :: String -> Response -> Bool+has_header s r = r.header s .isJust++set_header :: String -> String -> Response -> Response+set_header k v r = r +  { headers = (r.headers ++ [(k,v)] ) .to_h .toList }++set_content_type :: String -> Response -> Response+set_content_type s r = r.set_header _ContentType s++set_content_length :: Int -> Response -> Response+set_content_length i r = r.set_header _ContentLength (i.show)++set_body :: String -> Response -> Response+set_body s r = r { body = s }++set_status :: Int -> Response -> Response+set_status i r = r { status = i }++set_last_modified :: String -> Response -> Response+set_last_modified s r = r.set_header _LastModified s
+ src/Hack/Contrib/Utils.hs view
@@ -0,0 +1,122 @@+{-# LANGUAGE QuasiQuotes #-}+{-# LANGUAGE NoMonomorphismRestriction #-}++module Hack.Contrib.Utils where++import Hack+import Hack.Contrib.Constants++import MPSUTF8+import Prelude hiding ((.), (^), (>), lookup, (+), (/))++import Network.URI hiding (path)+import Data.Default++import Control.Arrow ((>>>), (<<<))+import Data.Map (lookup, Map)+import Data.Time+import Text.Template+import qualified Data.ByteString.Lazy.Char8 as B+import Control.Monad (mplus, MonadPlus)+import Data.Maybe+import System.IO+import System.Posix.Files+import System.Locale+import System.Directory+import Data.Time.Clock.POSIX+import System.FilePath ((</>))+import Data.Char (ord)+import Control.Category (Category)++import qualified Data.ByteString.Lazy.Char8 as B+import qualified Codec.Compression.GZip as GZip+import Codec.Binary.Base64.String as C++-- import Date.Time++(>) :: (Control.Category.Category cat) => cat a b -> cat b c -> cat a c+(>) = (>>>)+infixl 8 >++(+) :: (MonadPlus m) => m a -> m a -> m a+(+) = mplus+infixl 8 +++(/) :: FilePath -> FilePath -> FilePath+(/) = (</>)+infixl 5 /++empty_app :: Application+empty_app = return def++-- usage: app.use [content_type, cache]+use :: [Middleware] -> Middleware+use = reduce (<<<)++bytesize :: String -> Int+bytesize = B.pack > B.length > from_i++dummy_middleware :: Middleware+dummy_middleware = id++dummy_app :: Application+dummy_app _ = return $ def { status = 500 }++escape_html :: String -> String+escape_html = concatMap fixChar+    where+      fixChar '<' = "<"+      fixChar '>' = ">"+      fixChar '&' = "&"+      fixChar '"' = "\""+      fixChar c | ord c < 0x80 = [c]+      fixChar c = "&#" ++ show (ord c) ++ ";"++++show_status_code :: Int -> Maybe String+show_status_code x = status_code.lookup x++-- MPS candidate++now :: IO UTCTime+now = getCurrentTime++format_time :: String -> UTCTime -> String+format_time = formatTime defaultTimeLocale++interpolate :: String -> [(String, String)] -> String+interpolate s params = B.unpack $ substitute (B.pack s) (context params)+  where +    context = map packPair > to_h+    packPair (x, y) = (B.pack x, B.pack y)++just_lookup :: (Ord k) => k -> Data.Map.Map k a -> a+just_lookup s xs = xs.lookup s .fromJust++httpdate :: UTCTime -> String+httpdate x = x.format_time rfc822DateFormat where++file_size :: String -> IO Integer+file_size path = withFile (path.u2b) ReadMode hFileSize++file_mtime :: String -> IO UTCTime+file_mtime path = getFileStatus (path.u2b) +                  ^ modificationTime ^ realToFrac ^ posixSecondsToUTCTime++read_binary_file :: String -> IO String+read_binary_file path = path.u2b.B.readFile ^ B.unpack++get_permissions :: String -> IO Permissions+get_permissions path = getPermissions (path.u2b) ++url2unicode :: String -> String+url2unicode s = s.unEscapeString.b2u++get_current_directory :: IO String+get_current_directory = getCurrentDirectory ^ b2u++zip64, unzip64 :: String -> String+zip64 = B.pack > GZip.compress > B.unpack > C.encode+unzip64 = C.decode > B.pack > GZip.decompress > B.unpack+