module Strelka.Core.ResponseBuilder where

import Strelka.Core.Prelude
import Strelka.Core.Model


{-|
A composable abstraction for building an HTTP response.
-}
newtype ResponseBuilder =
  ResponseBuilder (Response -> Response)

instance Monoid ResponseBuilder where
  mempty =
    ResponseBuilder id
  mappend (ResponseBuilder fn1) (ResponseBuilder fn2) =
    ResponseBuilder (fn2 . fn1)

instance Semigroup ResponseBuilder where
  (<>) = mappend


{-|
Execute the builder producing Response.
-}
run :: ResponseBuilder -> Response
run (ResponseBuilder fn) =
  fn (Response (Status 200) [] (OutputStream (const (const (pure ())))))