{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
module DevForms (
ServerBuilder,
FormBuilder,
QuestionBuilder,
IntegerQuestionBuilder,
HasOptional (..),
HasBounds (..),
devFormServer,
form,
questionCheckbox,
questionCheckboxWith,
questionLikert,
questionLikertWith,
questionChoice,
questionChoiceWith,
questionDate,
questionDateWith,
questionTime,
questionTimeWith,
questionInteger,
questionIntegerWith,
questionFreeText,
questionFreeTextWith,
questionRegexText,
questionRegexTextWith,
) where
import Control.Monad.Writer
import Form (Form (..), FormBuilder)
import Question (
HasBounds (..),
HasOptional (..),
IntegerQuestionBuilder,
Question (..),
QuestionBuilder,
QuestionType (..),
runIntegerQuestionBuilder,
runQuestionBuilder,
)
import Server (Server (..), ServerBuilder, runServer)
devFormServer :: Int -> ServerBuilder () -> IO ()
devFormServer :: Int -> ServerBuilder () -> IO ()
devFormServer = Int -> ServerBuilder () -> IO ()
runServer
form :: Text -> Text -> FormBuilder () -> ServerBuilder ()
form :: Text -> Text -> FormBuilder () -> ServerBuilder ()
form Text
title Text
formId FormBuilder ()
formBuilder = do
let f :: Form
f = Endo Form -> Form -> Form
forall a. Endo a -> a -> a
appEndo (FormBuilder () -> Endo Form
forall w a. Writer w a -> w
execWriter FormBuilder ()
formBuilder) (Form -> Form) -> Form -> Form
forall a b. (a -> b) -> a -> b
$ Form{title :: Text
title = Text
title, formId :: Text
formId = Text
formId, questions :: [Question]
questions = []}
Endo Server -> ServerBuilder ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell (Endo Server -> ServerBuilder ())
-> Endo Server -> ServerBuilder ()
forall a b. (a -> b) -> a -> b
$ (Server -> Server) -> Endo Server
forall a. (a -> a) -> Endo a
Endo ((Server -> Server) -> Endo Server)
-> (Server -> Server) -> Endo Server
forall a b. (a -> b) -> a -> b
$ \server :: Server
server@Server{[Form]
forms :: [Form]
forms :: Server -> [Form]
forms} -> Server
server{forms = forms <> [f]}
addQuestion :: (MonadWriter (Endo Form) m) => Question -> m ()
addQuestion :: forall (m :: * -> *). MonadWriter (Endo Form) m => Question -> m ()
addQuestion Question
question =
Endo Form -> m ()
forall w (m :: * -> *). MonadWriter w m => w -> m ()
tell (Endo Form -> m ()) -> Endo Form -> m ()
forall a b. (a -> b) -> a -> b
$ (Form -> Form) -> Endo Form
forall a. (a -> a) -> Endo a
Endo ((Form -> Form) -> Endo Form) -> (Form -> Form) -> Endo Form
forall a b. (a -> b) -> a -> b
$ \f :: Form
f@Form{[Question]
questions :: Form -> [Question]
questions :: [Question]
questions} -> Form
f{questions = questions <> [question]}
questionCheckbox :: Text -> FormBuilder ()
questionCheckbox :: Text -> FormBuilder ()
questionCheckbox Text
label = Text -> QuestionBuilder () -> FormBuilder ()
questionCheckboxWith Text
label (() -> QuestionBuilder ()
forall a. a -> QuestionBuilder a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ())
questionCheckboxWith :: Text -> QuestionBuilder () -> FormBuilder ()
questionCheckboxWith :: Text -> QuestionBuilder () -> FormBuilder ()
questionCheckboxWith Text
questionText QuestionBuilder ()
builder =
Question -> FormBuilder ()
forall (m :: * -> *). MonadWriter (Endo Form) m => Question -> m ()
addQuestion (Question -> FormBuilder ()) -> Question -> FormBuilder ()
forall a b. (a -> b) -> a -> b
$ Text -> QuestionType -> QuestionOptions -> Question
Question Text
questionText QuestionType
QuestionCheckbox (QuestionBuilder () -> QuestionOptions
runQuestionBuilder QuestionBuilder ()
builder)
questionLikert :: Text -> FormBuilder ()
questionLikert :: Text -> FormBuilder ()
questionLikert Text
label = Text -> QuestionBuilder () -> FormBuilder ()
questionLikertWith Text
label (() -> QuestionBuilder ()
forall a. a -> QuestionBuilder a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ())
questionLikertWith :: Text -> QuestionBuilder () -> FormBuilder ()
questionLikertWith :: Text -> QuestionBuilder () -> FormBuilder ()
questionLikertWith Text
questionText QuestionBuilder ()
builder =
Question -> FormBuilder ()
forall (m :: * -> *). MonadWriter (Endo Form) m => Question -> m ()
addQuestion (Question -> FormBuilder ()) -> Question -> FormBuilder ()
forall a b. (a -> b) -> a -> b
$ Text -> QuestionType -> QuestionOptions -> Question
Question Text
questionText QuestionType
QuestionLikert (QuestionBuilder () -> QuestionOptions
runQuestionBuilder QuestionBuilder ()
builder)
questionChoice :: Text -> [Text] -> FormBuilder ()
questionChoice :: Text -> [Text] -> FormBuilder ()
questionChoice Text
label [Text]
options = Text -> [Text] -> QuestionBuilder () -> FormBuilder ()
questionChoiceWith Text
label [Text]
options (() -> QuestionBuilder ()
forall a. a -> QuestionBuilder a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ())
questionChoiceWith :: Text -> [Text] -> QuestionBuilder () -> FormBuilder ()
questionChoiceWith :: Text -> [Text] -> QuestionBuilder () -> FormBuilder ()
questionChoiceWith Text
title [Text]
qOptions QuestionBuilder ()
builder =
Question -> FormBuilder ()
forall (m :: * -> *). MonadWriter (Endo Form) m => Question -> m ()
addQuestion (Question -> FormBuilder ()) -> Question -> FormBuilder ()
forall a b. (a -> b) -> a -> b
$ Text -> QuestionType -> QuestionOptions -> Question
Question Text
title ([Text] -> QuestionType
QuestionChoice [Text]
qOptions) (QuestionBuilder () -> QuestionOptions
runQuestionBuilder QuestionBuilder ()
builder)
questionDate :: Text -> FormBuilder ()
questionDate :: Text -> FormBuilder ()
questionDate Text
label = Text -> QuestionBuilder () -> FormBuilder ()
questionDateWith Text
label (() -> QuestionBuilder ()
forall a. a -> QuestionBuilder a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ())
questionDateWith :: Text -> QuestionBuilder () -> FormBuilder ()
questionDateWith :: Text -> QuestionBuilder () -> FormBuilder ()
questionDateWith Text
questionText QuestionBuilder ()
builder =
Question -> FormBuilder ()
forall (m :: * -> *). MonadWriter (Endo Form) m => Question -> m ()
addQuestion (Question -> FormBuilder ()) -> Question -> FormBuilder ()
forall a b. (a -> b) -> a -> b
$ Text -> QuestionType -> QuestionOptions -> Question
Question Text
questionText QuestionType
QuestionDate (QuestionBuilder () -> QuestionOptions
runQuestionBuilder QuestionBuilder ()
builder)
questionTime :: Text -> FormBuilder ()
questionTime :: Text -> FormBuilder ()
questionTime Text
label = Text -> QuestionBuilder () -> FormBuilder ()
questionTimeWith Text
label (() -> QuestionBuilder ()
forall a. a -> QuestionBuilder a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ())
questionTimeWith :: Text -> QuestionBuilder () -> FormBuilder ()
questionTimeWith :: Text -> QuestionBuilder () -> FormBuilder ()
questionTimeWith Text
questionText QuestionBuilder ()
builder =
Question -> FormBuilder ()
forall (m :: * -> *). MonadWriter (Endo Form) m => Question -> m ()
addQuestion (Question -> FormBuilder ()) -> Question -> FormBuilder ()
forall a b. (a -> b) -> a -> b
$ Text -> QuestionType -> QuestionOptions -> Question
Question Text
questionText QuestionType
QuestionTime (QuestionBuilder () -> QuestionOptions
runQuestionBuilder QuestionBuilder ()
builder)
questionInteger :: Text -> FormBuilder ()
questionInteger :: Text -> FormBuilder ()
questionInteger Text
label = Text -> IntegerQuestionBuilder () -> FormBuilder ()
questionIntegerWith Text
label (() -> IntegerQuestionBuilder ()
forall a. a -> IntegerQuestionBuilder a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ())
questionIntegerWith :: Text -> IntegerQuestionBuilder () -> FormBuilder ()
questionIntegerWith :: Text -> IntegerQuestionBuilder () -> FormBuilder ()
questionIntegerWith Text
title IntegerQuestionBuilder ()
builder =
Question -> FormBuilder ()
forall (m :: * -> *). MonadWriter (Endo Form) m => Question -> m ()
addQuestion (Question -> FormBuilder ()) -> Question -> FormBuilder ()
forall a b. (a -> b) -> a -> b
$ Text -> QuestionType -> QuestionOptions -> Question
Question Text
title QuestionType
QuestionInteger (IntegerQuestionBuilder () -> QuestionOptions
runIntegerQuestionBuilder IntegerQuestionBuilder ()
builder)
questionFreeText :: Text -> FormBuilder ()
questionFreeText :: Text -> FormBuilder ()
questionFreeText Text
label = Text -> QuestionBuilder () -> FormBuilder ()
questionFreeTextWith Text
label (() -> QuestionBuilder ()
forall a. a -> QuestionBuilder a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ())
questionFreeTextWith :: Text -> QuestionBuilder () -> FormBuilder ()
questionFreeTextWith :: Text -> QuestionBuilder () -> FormBuilder ()
questionFreeTextWith Text
questionText QuestionBuilder ()
builder =
Question -> FormBuilder ()
forall (m :: * -> *). MonadWriter (Endo Form) m => Question -> m ()
addQuestion (Question -> FormBuilder ()) -> Question -> FormBuilder ()
forall a b. (a -> b) -> a -> b
$ Text -> QuestionType -> QuestionOptions -> Question
Question Text
questionText QuestionType
QuestionFreeText (QuestionBuilder () -> QuestionOptions
runQuestionBuilder QuestionBuilder ()
builder)
questionRegexText :: Text -> Text -> FormBuilder ()
questionRegexText :: Text -> Text -> FormBuilder ()
questionRegexText Text
label Text
regexPattern = Text -> Text -> QuestionBuilder () -> FormBuilder ()
questionRegexTextWith Text
label Text
regexPattern (() -> QuestionBuilder ()
forall a. a -> QuestionBuilder a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ())
questionRegexTextWith :: Text -> Text -> QuestionBuilder () -> FormBuilder ()
questionRegexTextWith :: Text -> Text -> QuestionBuilder () -> FormBuilder ()
questionRegexTextWith Text
questionText Text
regexPattern QuestionBuilder ()
builder =
Question -> FormBuilder ()
forall (m :: * -> *). MonadWriter (Endo Form) m => Question -> m ()
addQuestion (Question -> FormBuilder ()) -> Question -> FormBuilder ()
forall a b. (a -> b) -> a -> b
$ Text -> QuestionType -> QuestionOptions -> Question
Question Text
questionText (Text -> QuestionType
QuestionRegexText Text
regexPattern) (QuestionBuilder () -> QuestionOptions
runQuestionBuilder QuestionBuilder ()
builder)