packages feed

devforms-0.1.0.0: src/DevForms.hs

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}

module DevForms (devFormServer, form, questionCheckbox, questionLikert, questionChoice, questionDate, questionTime, questionInteger, setLowerBoundInclusive, setUpperBoundInclusive) where

import Control.Monad.Writer
import Form (Form (..), FormBuilder)
import Question (Question (..), QuestionBuilder, QuestionOptions (..))
import Server (Server (..), ServerBuilder, runServer)

devFormServer :: Int -> ServerBuilder () -> IO ()
devFormServer = runServer

-- devFormServer serverBuilder = do
--     let forms = appEndo (execWriter serverBuilder) $ Server{forms = []}
--     print $ forms

form :: Text -> Text -> FormBuilder () -> ServerBuilder ()
form title formId formBuilder = do
    let f = appEndo (execWriter formBuilder) $ Form{title = title, formId = formId, questions = []}
    tell $ Endo $ \server@Server{forms} -> server{forms = forms <> [f]}

addQuestion :: (MonadWriter (Endo Form) m) => Question -> m ()
addQuestion question =
    tell $ Endo $ \f@Form{questions} -> f{questions = questions <> [question]}

questionCheckbox :: Text -> FormBuilder ()
questionCheckbox =
    addQuestion . QuestionCheckbox

questionLikert :: Text -> FormBuilder ()
questionLikert = addQuestion . QuestionLikert

questionChoice :: Text -> [Text] -> FormBuilder ()
questionChoice title qOptions =
    addQuestion $ QuestionChoice title qOptions

questionDate :: Text -> FormBuilder ()
questionDate = addQuestion . QuestionDate

questionTime :: Text -> FormBuilder ()
questionTime = addQuestion . QuestionTime

questionInteger :: Text -> QuestionBuilder () -> FormBuilder ()
questionInteger title questionBuilder = do
    let questionOptions = appEndo (execWriter questionBuilder) $ QuestionOptions{lowerBoundInclusive = Nothing, upperBoundInclusive = Nothing}
    addQuestion $ QuestionInteger title questionOptions

setLowerBoundInclusive :: Integer -> QuestionBuilder ()
setLowerBoundInclusive bound = tell $ Endo $ \questionOptions -> questionOptions{lowerBoundInclusive = Just bound}
setUpperBoundInclusive :: Integer -> QuestionBuilder ()
setUpperBoundInclusive bound = tell $ Endo $ \questionOptions -> questionOptions{upperBoundInclusive = Just bound}