module SocketsAndPipes.Syllabus
  (
    -- * Chapters
    -- $chapters

    -- * Libraries
    -- $libraries
  )
  where

import Prelude ()

import qualified ASCII as A
import qualified Control.Concurrent as Concurrent
import qualified Control.Concurrent.Async as Async
import qualified Control.Concurrent.STM as STM
import qualified Control.Monad.Trans.Resource as Resource
import qualified Data.ByteString as BS
import qualified Data.ByteString.Builder as BSB
import qualified Data.Text as T
import qualified Data.Text.Lazy.Builder as TB
import qualified Data.Time as Time
import qualified Network.Simple.TCP as Net
import qualified Prelude

{- $chapters

List of modules that make a significant appearance in each chapter:

__Setup__

  * "Relude" - Alternate prelude that includes a lot of standard utilities
  * "System.Directory", "System.FilePath" - Determining where our data files should go

__1 - Handles__

  * "System.IO" - Writing to a file
  * "Control.Monad.Trans.Resource" - Using 'Resource.allocate' to ensure that file handles are closed

__2 - Chunks__

  * "Data.Text" - 'T.Text' is a chunk of characters
  * "Data.Text.IO" - Reading and writing files using 'T.Text' instead of 'Prelude.String'

__3 - Bytes__

  * "Data.ByteString" - 'BS.ByteString' is a chunk of bytes
  * "Data.Text.Encoding" - Conversions between 'BS.ByteString' and 'T.Text'

__4 - Sockets__

  * "Network.Socket" - Opening and closing sockets, resolving network addresses
  * "Network.Socket.ByteString" - Writing to and reading from sockets

__5 - HTTP__

  * "ASCII", "ASCII.Char" - Expressing HTTP messages as strings using the 'A.string' quasi-quoter
  * "Network.Simple.TCP" - Listening for client connections using 'Net.serve'

__6 - HTTP types__

  * "ASCII.Decimal", "Data.ByteString.Lazy" - Defining datatypes for the parts of an HTTP message

__7 - Encoding__

  * "Data.Text.Lazy",  "Data.Text.Lazy.Builder" - Efficient text concatenations with 'TB.Builder'
  * "Data.ByteString.Lazy", "Data.ByteString.Builder" - Efficient byte string concatenations with 'BSB.Builder'
  * "Data.Time" - Simple performance testing with 'Time.getCurrentTime' and 'Time.diffUTCTime'

__8 - Responding__

  * No additional imports in this chapter

__9 - Content types__

  * "Data.Text.Lazy.Builder.Int", "Data.Text.Lazy.IO",  "Data.Text.Lazy.Encoding" - Building a text response body
  * "Text.Blaze.Html", "Text.Blaze.Html5", "Text.Blaze.Html.Renderer.Utf8" - Building an HTML response body
  * "Data.Aeson", "Data.Aeson.Key", "Data.Aeson.KeyMap" - Building a JSON response body

__10 - Change__

  * "Control.Concurrent.STM" - Shared 'STM.TVar' state for request-handling threads
  * "Control.Concurrent.Async" - Demonstrating thread safety with 'Async.replicateConcurrently_'

__11 - Streaming__

  * "Control.Concurrent" - Slowing things down with 'Concurrent.threadDelay'

__12 - ListT IO__

  * "List.Transformer" - Representing files and chunked HTTP message bodies as I/O streams

__13 - Parsing__

  * "Data.Map.Strict" - Mapping resource names to file paths
  * "Data.Attoparsec.ByteString" - Parsing HTTP requests

__14 - Errors__

  * "Unfork" - Thread-safe logging

The remaining chapters are in progress:

__15 - Reading the head__

__16 - Reading the body__

__17 - Connection reuse__

-}

{- $libraries

Re-exported modules, grouped by the package that each module originally comes from:

__ascii__ - "ASCII", "ASCII.Char", "ASCII.Decimal"

__aeson__ - "Data.Aeson", "Data.Aeson.Key", "Data.Aeson.KeyMap"

__async__ - "Control.Concurrent.Async"

__base__

  * File handles - "System.IO"
  * Fundamental data types - "Data.Char"
  * Miscellanea - "Control.Concurrent", "Control.Monad"

__blaze-html__ - "Text.Blaze.Html", "Text.Blaze.Html5", "Text.Blaze.Html5.Attributes", "Text.Blaze.Html.Renderer.Utf8"

__bytestring__

  * Strict - "Data.ByteString"
  * Lazy - "Data.ByteString.Lazy"
  * Builder - "Data.ByteString.Builder"
  * "Data.ByteString.Char8" - To discuss why we don't use it

__containers__ - "Data.Map.Strict"

__directory__ - "System.Directory"

__filepath__ - "System.FilePath"

__list-transformer__ - "List.Transformer"

__network__

  * "Network.Socket" - The Socket type, operations for opening and closing sockets
  * "Network.Socket.ByteString" - Socket read/write operations with strict byte strings

__network-simple__

  * "Network.Simple.TCP" - Sockets that listen for incoming client connections

__relude__ - "Relude"

__resourcet__ - "Control.Monad.Trans.Resource"

__safe-exceptions__ - "Control.Exception.Safe"

__stm__ - "Control.Monad.STM", "Control.Concurrent.STM", "Control.Concurrent.STM.TVar"

__text__

  * Strict - "Data.Text", "Data.Text.Encoding", "Data.Text.IO"
  * Lazy - "Data.Text.Lazy", "Data.Text.Lazy.Encoding", "Data.Text.Lazy.IO"
  * Builder - "Data.Text.Lazy.Builder", "Data.Text.Lazy.Builder.Int"

__time__ - "Data.Time"

__unfork__ - "Unfork"

-}