<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    Dear all, <br>
    <br>
    I am pleased to announce the first release of ivy-web after learning
    haskell for a year.<br>
    <br>
    Ivy-web is a lightweight web framework, with type safe routes, based
    on invertible-syntax, and i18n support, influenced by Django, Snap
    and Yesod.
    <p>The features of this web framework: </p>
    <ul>
      <li>
        <p> Type safe routes, specify url-handler mapping in one place.
          For example, we want a url mapping for blog as
          "/blog/year-month-day" to Handler Int Int Int, where year,
          month and day are integers. We can declare as follows:</p>
      </li>
    </ul>
    <blockquote>    data Blog = Blog Int Int Int deriving (Show, Eq,
      Typeable)<br>
          $(defineIsomorphisms ''Blog)<br>
      <br>
          instance Handler Blog where<br>
      <blockquote>   get b@(Blog y m d) _ = do<br>
                t &lt;- liftIO getClockTime<br>
                return $ responseHtml $ trans' "blog" ++ show b ++ show
        t<br>
      </blockquote>
    </blockquote>
                rBlog = blog &lt;$&gt; text "/blog/" *&gt; int &lt;-&gt;
    int &lt;-&gt; int<br>
    <blockquote>We can reverse this mapping from handler value
      automatically, thus don't need to construct url string manually in
      code, avoiding url errors.<br>
    </blockquote>
    <blockquote>ghci&gt;url (Blog 2011 9 19) == "/blog/2011-9-19"<br>
    </blockquote>
    <ul>
      <li>
        <p> Simple yet elegant handler via type class. </p>
      </li>
    </ul>
    <blockquote>class Handler a where<br>
          get, post, put, delete, handle :: a -&gt; Application<br>
          handle a req = case requestMethod req of<br>
              m | m == methodGet -&gt; get a req<br>
                | m == methodPost -&gt; post a req<br>
                | m == methodPut -&gt; put a req<br>
                | m == methodDelete -&gt; delete a req<br>
              otherwise -&gt; unimplemented req<br>
    </blockquote>
    <ul>
      <li>
        <p> Flexible template system, utilize exsisting libraries such
          as Blaze-Html and Hastache. </p>
      </li>
      <li>
        <p> Easy i18n </p>
      </li>
    </ul>
            Wraps around i18n library.<br>
    <ul>
      <li>TODO: Auth system</li>
    </ul>
    <blockquote>Port from snap-auth.<br>
    </blockquote>
    <ul>
      <li>TODO: Modular app system like Django</li>
    </ul>
            The current route system support modular routes very well.
    Need works in modular config and data files like static template
    files.<br>
    <ul>
      <li>TODO: Persistent library</li>
    </ul>
    <blockquote>Improving the DSH library is my current preference.<br>
    </blockquote>
    <br>
    The principle of this library is KISS, and "don't reinvent the
    wheel" by reusing existing state-of-the-art libraries.<br>
     <br>
    Hackage: <a href="http://hackage.haskell.org/package/ivy-web">http://hackage.haskell.org/package/ivy-web</a><br>
    Repo: <a href="https://github.com/lilac/ivy-web/">https://github.com/lilac/ivy-web/</a><br>
    <p>For the example code listed above, please refer to <a
        href="https://github.com/lilac/ivy-example/">https://github.com/lilac/ivy-example/</a>
    </p>
    <div class="moz-signature">-- <br>
      <b>James Deng</b><br>
      department of computer science<br>
      school of information science &amp; technology<br>
      Sun-yat-sen University, Guangzhou, China<br>
      <a href="http://cnjdeng.appspot.com">http://cnjdeng.appspot.com</a></div>
  </body>
</html>