The fn package

[maintain]
Warnings:

Please see README.


[Skip to ReadMe]

Properties

Versions0.0.0.0, 0.1.0.0, 0.1.1.0, 0.1.1.0, 0.1.2.0, 0.1.3.0, 0.1.3.1, 0.1.4.0, 0.2.0.0, 0.2.0.1, 0.2.0.2, 0.3.0.0, 0.3.0.1
Dependenciesbase (>=4.7 && <5), blaze-builder, bytestring, http-types, text, wai [details]
LicenseISC
Copyright2015 Daniel Patterson
AuthorDaniel Patterson <dbp@dbpmail.net>
Maintainerdbp@dbpmail.net
CategoryWeb
Home pagehttp://github.com/dbp/fn#readme
Source repositoryhead: git clone https://github.com/dbp/fn
UploadedTue Oct 27 00:35:09 UTC 2015 by DanielPatterson

Modules

[Index]

Downloads

Maintainers' corner

For package maintainers and hackage trustees

Readme for fn-0.1.1.0

Fn (eff-enn) - a functional web framework.

Or, how to do away with the monad transformers, and just use plain functions.

Example

See the example application in the repository for a full usage, but a minimal application is the following:


{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell   #-}

import           Control.Lens
import           Data.Monoid
import           Data.Text                (Text)
import qualified Data.Text                as T
import           Network.HTTP.Types
import           Network.Wai
import           Network.Wai.Handler.Warp
import qualified Network.Wai.Util         as W
import           Web.Fn

data Ctxt = Ctxt { _req :: Request
                 }

makeLenses ''Ctxt

instance RequestContext Ctxt where
  requestLens = req

initializer :: IO Ctxt
initializer = return (Ctxt defaultRequest)

main :: IO ()
main = do context <- initializer
          run 8000 $ toWAI context app

app :: Ctxt -> IO Response
app ctxt =
  route ctxt [ end ==> index
             , path "foo" // segment // path "baz" /? param "id" ==> handler]
    `fallthrough` notFoundText "Page not found."

index :: IO (Maybe Response)
index = okText "This is the index page! Try /foo/bar/baz?id=10"

handler :: Ctxt -> Text -> Int -> IO (Maybe Response)
handler _ fragment i = okText (fragment <> " - " <> T.pack (show i))

Recommended Pairings

Part of the design of Fn is that you won't need a suite of fn-foo libraries that generally serve to adapt the functions from foo to the monad transformer stack of the web framework of choice (we may add an fn-extra package with a few helpers in it in the future, but it'll be small). Still, it's helpful to know what are common tools that are well designed and tested, so here are a list (those marked with [*] are used in the example application included in the repository):