casa-reoc-0.1.0.0: src/ReOC/Data/OperationsManual.hs
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE TypeOperators #-}
{-# OPTIONS_GHC -Wall #-}
-- The checks of inheritance (inheritOperationsManual') have a constraint that their body does not use, by design.
{-# OPTIONS_GHC -Wno-redundant-constraints #-}
-- | The data type @OperationsManual'@: the parts of the operations manual that are not part of the operator. The manual is reviewed 12 months after the date of its last amendment.
module ReOC.Data.OperationsManual (
OperationsManual' (..),
OperationsManual'Like (..),
lawNamesOperationsManual',
OperationsManual,
UnfilledOperationsManual,
mkOperationsManual,
mkUnfilledOperationsManual,
InheritOperationsManual',
inheritOperationsManual',
) where
import Control.Lens (Optic, cloneLens, view)
import Data.Functor.Const (Const)
import Data.List.NonEmpty (NonEmpty)
import Data.Text (Text)
import ReOC.Data.Crewing (Crewing)
import ReOC.Data.FirstIssue (FirstIssue, UnfilledFirstIssue, mkUnfilledFirstIssue)
import ReOC.Data.Policies (Policies, UnfilledPolicies, mkUnfilledPolicies)
import ReOC.Data.RemotePilots (RemotePilots)
import ReOC.Data.Revision (Revision, UnfilledRevision)
import ReOC.Data.Risk (Risk, UnfilledRisk)
import ReOC.Name.Crew (CrewLike (..))
import ReOC.Name.FirstIssue (FirstIssueLike (..))
import ReOC.Name.Pilots (PilotsLike (..))
import ReOC.Name.Policies (PoliciesLike (..))
import ReOC.Name.Revisions (RevisionsLike (..))
import ReOC.Name.RiskRegister (RiskRegisterLike (..))
import ReOC.Name.Services (ServicesLike (..))
import ReOC.Primitive.Text1 (Text1)
-- | The parts of the operations manual that are not part of the operator. The manual is reviewed 12 months after the date of its last amendment. Its valid form is @OperationsManual@, and its unfilled form @UnfilledOperationsManual@.
data OperationsManual' a1 a2 a3 a4 a5 a6 a7 = OperationsManual' a1 a2 a3 a4 a5 a6 a7
deriving (Eq, Ord, Show)
-- | The name of the data type @OperationsManual'@.
class OperationsManual'Like p f x x' a1 a1' a2 a2' a3 a3' a4 a4' a5 a5' a6 a6' a7 a7' | x -> a1 a2 a3 a4 a5 a6 a7 where
operationsManual' ::
Optic p f x x' (OperationsManual' a1 a2 a3 a4 a5 a6 a7) (OperationsManual' a1' a2' a3' a4' a5' a6' a7')
-- | Identity
instance (x' ~ OperationsManual' a1' a2' a3' a4' a5' a6' a7') => OperationsManual'Like p f (OperationsManual' a1 a2 a3 a4 a5 a6 a7) x' a1 a1' a2 a2' a3 a3' a4 a4' a5 a5' a6 a6' a7 a7' where
operationsManual' = id
-- | Lens
instance (p ~ (->), Functor f, x' ~ OperationsManual' a1' a2 a3 a4 a5 a6 a7) => FirstIssueLike p f (OperationsManual' a1 a2 a3 a4 a5 a6 a7) x' a1 a1' where
firstIssue f (OperationsManual' x1 x2 x3 x4 x5 x6 x7) = fmap (\x1' -> OperationsManual' x1' x2 x3 x4 x5 x6 x7) (f x1)
-- | Lens
instance (p ~ (->), Functor f, x' ~ OperationsManual' a1 a2' a3 a4 a5 a6 a7) => RevisionsLike p f (OperationsManual' a1 a2 a3 a4 a5 a6 a7) x' a2 a2' where
revisions f (OperationsManual' x1 x2 x3 x4 x5 x6 x7) = fmap (\x2' -> OperationsManual' x1 x2' x3 x4 x5 x6 x7) (f x2)
-- | Lens
instance (p ~ (->), Functor f, x' ~ OperationsManual' a1 a2 a3' a4 a5 a6 a7) => ServicesLike p f (OperationsManual' a1 a2 a3 a4 a5 a6 a7) x' a3 a3' where
services f (OperationsManual' x1 x2 x3 x4 x5 x6 x7) = fmap (\x3' -> OperationsManual' x1 x2 x3' x4 x5 x6 x7) (f x3)
-- | Lens
instance (p ~ (->), Functor f, x' ~ OperationsManual' a1 a2 a3 a4' a5 a6 a7) => PoliciesLike p f (OperationsManual' a1 a2 a3 a4 a5 a6 a7) x' a4 a4' where
policies f (OperationsManual' x1 x2 x3 x4 x5 x6 x7) = fmap (\x4' -> OperationsManual' x1 x2 x3 x4' x5 x6 x7) (f x4)
-- | Lens
instance (p ~ (->), Functor f, x' ~ OperationsManual' a1 a2 a3 a4 a5' a6 a7) => RiskRegisterLike p f (OperationsManual' a1 a2 a3 a4 a5 a6 a7) x' a5 a5' where
riskRegister f (OperationsManual' x1 x2 x3 x4 x5 x6 x7) = fmap (\x5' -> OperationsManual' x1 x2 x3 x4 x5' x6 x7) (f x5)
-- | Lens
instance (p ~ (->), Functor f, x' ~ OperationsManual' a1 a2 a3 a4 a5 a6' a7) => CrewLike p f (OperationsManual' a1 a2 a3 a4 a5 a6 a7) x' a6 a6' where
crew f (OperationsManual' x1 x2 x3 x4 x5 x6 x7) = fmap (\x6' -> OperationsManual' x1 x2 x3 x4 x5 x6' x7) (f x6)
-- | Lens
instance (p ~ (->), Functor f, x' ~ OperationsManual' a1 a2 a3 a4 a5 a6 a7') => PilotsLike p f (OperationsManual' a1 a2 a3 a4 a5 a6 a7) x' a7 a7' where
pilots f (OperationsManual' x1 x2 x3 x4 x5 x6 x7) = fmap (OperationsManual' x1 x2 x3 x4 x5 x6) (f x7)
{- | Rebuilds a value from the name of each field or constructor.
Laws:
> lawNamesOperationsManual' == id
-}
lawNamesOperationsManual' :: OperationsManual' a1 a2 a3 a4 a5 a6 a7 -> OperationsManual' a1 a2 a3 a4 a5 a6 a7
lawNamesOperationsManual' s =
OperationsManual'
(view (cloneLens firstIssue) s)
(view (cloneLens revisions) s)
(view (cloneLens services) s)
(view (cloneLens policies) s)
(view (cloneLens riskRegister) s)
(view (cloneLens crew) s)
(view (cloneLens pilots) s)
-- | A valid @OperationsManual'@.
type OperationsManual = OperationsManual' FirstIssue [Revision] (NonEmpty Text1) Policies (NonEmpty Risk) Crewing RemotePilots
-- | An unfilled @OperationsManual'@: each field holds what has been entered, if anything, to be checked by @fillOperationsManual@.
type UnfilledOperationsManual = OperationsManual' UnfilledFirstIssue [UnfilledRevision] [Text] UnfilledPolicies [UnfilledRisk] (Maybe Crewing) (Maybe RemotePilots)
-- | Builds a valid @OperationsManual'@ with every @Maybe@ field @Nothing@ and every list (or @AtMost@) field empty.
mkOperationsManual :: FirstIssue -> NonEmpty Text1 -> Policies -> NonEmpty Risk -> Crewing -> RemotePilots -> OperationsManual
mkOperationsManual x1 = OperationsManual' x1 []
-- | An unfilled @OperationsManual'@ with nothing entered.
mkUnfilledOperationsManual :: UnfilledOperationsManual
mkUnfilledOperationsManual =
OperationsManual'
mkUnfilledFirstIssue
[]
[]
mkUnfilledPolicies
[]
Nothing
Nothing
-- | The classes that a data type holding @OperationsManual'@ in one field, or in one or more constructors, inherits.
type InheritOperationsManual' s a1 a2 a3 a4 a5 a6 a7 =
( OperationsManual'Like (->) (Const ()) s s a1 a1 a2 a2 a3 a3 a4 a4 a5 a5 a6 a6 a7 a7
, FirstIssueLike (->) (Const ()) s s a1 a1
, RevisionsLike (->) (Const ()) s s a2 a2
, ServicesLike (->) (Const ()) s s a3 a3
, PoliciesLike (->) (Const ()) s s a4 a4
, RiskRegisterLike (->) (Const ()) s s a5 a5
, CrewLike (->) (Const ()) s s a6 a6
, PilotsLike (->) (Const ()) s s a7 a7
)
-- | Checks that a data type inherits every class of @InheritOperationsManual'@.
inheritOperationsManual' :: (InheritOperationsManual' s a1 a2 a3 a4 a5 a6 a7) => proxy s -> ()
inheritOperationsManual' _ = ()