{-# LANGUAGE DataKinds        #-}
{-# LANGUAGE DeriveGeneric    #-}
{-# LANGUAGE TypeApplications #-}

-- | Types for Form.
module Reflex.Bulmex.Form.FormTypes
  ( FormAction(..)
  , FormState(..)
  -- * Prisms
  , _PostDefault
  , _Loading
  , _FormRest
  ) where

import           Control.Lens
import           Data.Generics.Sum
import           GHC.Generics      (Generic)

data FormAction
  = PostDefault -- ^ do the post
  | Loading -- ^ trigger spin state without doing default the post
  | FormRest -- ^ stop the spin state
  deriving (Generic)

_PostDefault :: Prism' FormAction ()
_PostDefault = _Ctor @"PostDefault"

_Loading :: Prism' FormAction ()
_Loading = _Ctor @"Loading"

_FormRest :: Prism' FormAction ()
_FormRest = _Ctor @"FormRest"

data FormState
  = FormStateRest
  | FormStateSpinning
  deriving (Show)

instance Semigroup FormState where
  (<>) FormStateRest FormStateRest = FormStateRest
  (<>) _ _                         = FormStateSpinning

instance Monoid FormState where
  mempty = FormStateRest