-- Copyright (c) 2013, GREE, Inc. All rights reserved.
-- authors: Kiyoshi Ikehara <kiyoshi.ikehara@gree.net>

{- |
Module: Network.Memcache
Maintainer: Kiyoshi Ikehara <kiyoshi.ikehara@gree.net>

memcache-haskell is a memcache protocol library for server and client application.

If you want to implement a simple memcache client, just import "Network.Memcache" module and use withClient function.

> import Network.Memcache
>   
> main = do
>   mValue <- withClient "127.0.0.1:11211" $ \client -> get client "key"
>   case mValue of
>     Nothing -> putStrLn "(no value)"
>     Just value -> putStrLn value

Or, use openClient and closeClient pair for more complex cases.

> import Control.Exception
> import Control.Monad.Trans.Resource (allocate, release, runResourceT)
> import Control.Monad.IO.Class
> import Network.Memcache
> import System.Environment
> 
> main :: IO ()
> main = do
>   args <- getArgs
>   case args of
>     [] -> main' "127.0.0.1:11211"
>     (nk:_) -> main' nk
> 
> main' :: Nodekey -> IO ()
> main' nodekey = runResourceT $ do
>   (rkeyClient , client) <- flip allocate closeClient $ do
>     c <- openClient nodekey
>     case c of
>       Just client -> return (client)
>       Nothing -> liftIO $ do
>         throwIO (userError "could not open.")
>   liftIO $ do
>     ret <- set client "key" "foo"
>     print ret
>     ret' <- get client "key" :: IO (Maybe String)
>     print ret'
>   release rkeyClient

If your application is more complex and should recognize memcache command and response directly,
you have to import more and use low-level functions.

For server application, please use "Network.Memcache.Op" and "Network.Memcache.Response" directly to parse and process each command.

If you are familiar with conduit library, please take a look at memcache-conduit library and you will
find that you can write a memcache protocol server very quickly.

> main :: IO ()
> main = do
>   runResourceT $ do
>     runTCPServer (serverSettings 13301 HostAny) $ \appData -> do
>       (appSource appData)
>         $$ getOpText
>         =$ process htVar
>         =$ putResponseText
>         =$ (appSink appData)
>
> process = ...

-}

module Network.Memcache (
    module Network.Memcache.Client
  , module Network.Memcache.Stats
  , module Network.Memcache.Class
  ) where

import Network.Memcache.Class
import Network.Memcache.Client
import Network.Memcache.Stats