packages feed

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' _ = ()