casa-reoc-0.1.0.0: src/ReOC/Data/OperationalExperience.hs
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE TypeOperators #-}
{-# OPTIONS_GHC -Wall #-}
-- The checks of inheritance (inheritOperationalExperience') have a constraint that their body does not use, by design.
{-# OPTIONS_GHC -Wno-redundant-constraints #-}
-- | The data type @OperationalExperience'@: whether the chief RePL instructor has 20 hours of non-training operational experience for each category trained (CASA Form 101-02, questions 16 and 17).
module ReOC.Data.OperationalExperience (
OperationalExperience' (..),
OperationalExperience'Like (..),
lawNamesOperationalExperience',
OperationalExperience,
UnfilledOperationalExperience,
InheritOperationalExperience',
inheritOperationalExperience',
) where
import Control.Lens (Choice, Optic, prism, prism', review)
import Data.Functor.Const (Const)
import Data.Text (Text)
import ReOC.Name.HasOperationalExperience (HasOperationalExperienceLike (..))
import ReOC.Name.OperationalExperienceIntent (OperationalExperienceIntentLike (..))
import ReOC.Name.OperationalExperienceNotApplicable (OperationalExperienceNotApplicableLike (..))
import ReOC.Primitive.FormText (FormFont (..), FormText)
-- | Whether the chief RePL instructor has 20 hours of non-training operational experience for each category trained (CASA Form 101-02, questions 16 and 17). Its valid form is @OperationalExperience@, and its unfilled form @UnfilledOperationalExperience@.
data OperationalExperience' a1
= HasOperationalExperience
| OperationalExperienceIntent a1
| OperationalExperienceNotApplicable
deriving (Eq, Ord, Show)
-- | The name of the data type @OperationalExperience'@.
class OperationalExperience'Like p f x x' a1 a1' | x -> a1 where
operationalExperience' ::
Optic p f x x' (OperationalExperience' a1) (OperationalExperience' a1')
-- | Identity
instance (x' ~ OperationalExperience' a1') => OperationalExperience'Like p f (OperationalExperience' a1) x' a1 a1' where
operationalExperience' = id
-- | Prism
instance (Choice p, Applicative f, x' ~ OperationalExperience' a1) => HasOperationalExperienceLike p f (OperationalExperience' a1) x' where
hasOperationalExperience = prism' (\() -> HasOperationalExperience) (\case HasOperationalExperience -> Just (); OperationalExperienceIntent _ -> Nothing; OperationalExperienceNotApplicable -> Nothing)
-- | Prism
instance (Choice p, Applicative f, x' ~ OperationalExperience' a1') => OperationalExperienceIntentLike p f (OperationalExperience' a1) x' a1 a1' where
operationalExperienceIntent = prism OperationalExperienceIntent (\case HasOperationalExperience -> Left HasOperationalExperience; OperationalExperienceIntent x -> Right x; OperationalExperienceNotApplicable -> Left OperationalExperienceNotApplicable)
-- | Prism
instance (Choice p, Applicative f, x' ~ OperationalExperience' a1) => OperationalExperienceNotApplicableLike p f (OperationalExperience' a1) x' where
operationalExperienceNotApplicable = prism' (\() -> OperationalExperienceNotApplicable) (\case HasOperationalExperience -> Nothing; OperationalExperienceIntent _ -> Nothing; OperationalExperienceNotApplicable -> Just ())
{- | Rebuilds a value from the name of each field or constructor.
Laws:
> lawNamesOperationalExperience' == id
-}
lawNamesOperationalExperience' :: OperationalExperience' a1 -> OperationalExperience' a1
lawNamesOperationalExperience' = \case
HasOperationalExperience -> review hasOperationalExperience ()
OperationalExperienceIntent x -> review operationalExperienceIntent x
OperationalExperienceNotApplicable -> review operationalExperienceNotApplicable ()
-- | A valid @OperationalExperience'@.
type OperationalExperience = OperationalExperience' (FormText 'Wide 185 5)
-- | An unfilled @OperationalExperience'@: each field holds what has been entered, if anything, to be checked by @fillOperationalExperience@.
type UnfilledOperationalExperience = OperationalExperience' (Maybe Text)
-- | The classes that a data type holding @OperationalExperience'@ in one field, or in one or more constructors, inherits.
type InheritOperationalExperience' s a1 =
( OperationalExperience'Like (->) (Const ()) s s a1 a1
, HasOperationalExperienceLike (->) (Const ()) s s
, OperationalExperienceIntentLike (->) (Const ()) s s a1 a1
, OperationalExperienceNotApplicableLike (->) (Const ()) s s
)
-- | Checks that a data type inherits every class of @InheritOperationalExperience'@.
inheritOperationalExperience' :: (InheritOperationalExperience' s a1) => proxy s -> ()
inheritOperationalExperience' _ = ()