document-build-0.2.0.0: src/Document/Build/Error/OutputNotInDirectory.hs
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeOperators #-}
{-# OPTIONS_GHC -Wall #-}
{- | A file that a build step made outside the output directory.
A 'OutputNotInDirectory' is a product: its fields are named 'file' and 'outputDirectory'.
-}
module Document.Build.Error.OutputNotInDirectory (
-- * Type
OutputNotInDirectory (..),
-- * Optics
OutputNotInDirectoryLike (..),
lawNamesOutputNotInDirectory,
InheritOutputNotInDirectory,
inheritOutputNotInDirectory,
) where
import Control.DeepSeq (NFData)
import Control.Lens (Optic, cloneLens, view)
import Data.Data (Data)
import Data.Functor.Const (Const)
import Document.Build.Name.OutputDirectory (OutputDirectoryLike (..))
import GHC.Generics (Generic)
import System.FilePather.Name.File (FileLike (..))
{- | A build step made a file ('file') outside the output directory ('outputDirectory').
@since 0.2.0.0
-}
data OutputNotInDirectory
= OutputNotInDirectory FilePath FilePath
deriving stock (Eq, Ord, Show, Generic, Data)
deriving anyclass (NFData)
{- | The class of 'OutputNotInDirectory'.
@since 0.2.0.0
-}
class OutputNotInDirectoryLike p f x x' where
outputNotInDirectory ::
Optic p f x x' OutputNotInDirectory OutputNotInDirectory
{- | Identity
@since 0.2.0.0
-}
instance (x' ~ OutputNotInDirectory) => OutputNotInDirectoryLike p f OutputNotInDirectory x' where
outputNotInDirectory =
id
{-# INLINE outputNotInDirectory #-}
{- | Lens
@since 0.2.0.0
-}
instance (p ~ (->), Functor f, x' ~ OutputNotInDirectory) => FileLike p f OutputNotInDirectory x' where
file f (OutputNotInDirectory x1 x2) =
fmap (`OutputNotInDirectory` x2) (f x1)
{-# INLINE file #-}
{- | Lens
@since 0.2.0.0
-}
instance (p ~ (->), Functor f, x' ~ OutputNotInDirectory) => OutputDirectoryLike p f OutputNotInDirectory x' where
outputDirectory f (OutputNotInDirectory x1 x2) =
fmap (OutputNotInDirectory x1) (f x2)
{-# INLINE outputDirectory #-}
{- | Rebuild a value using only the name of each field.
Laws:
> lawNamesOutputNotInDirectory == id
@since 0.2.0.0
-}
lawNamesOutputNotInDirectory :: OutputNotInDirectory -> OutputNotInDirectory
lawNamesOutputNotInDirectory s =
OutputNotInDirectory
(view (cloneLens file) s)
(view (cloneLens outputDirectory) s)
{- | The classes that a data type holding 'OutputNotInDirectory' inherits.
@since 0.2.0.0
-}
type InheritOutputNotInDirectory s =
( OutputNotInDirectoryLike (->) (Const ()) s s
, FileLike (->) (Const ()) s s
, OutputDirectoryLike (->) (Const ()) s s
)
{- | Check, where it is applied, that @s@ inherits every name of 'OutputNotInDirectory'.
@since 0.2.0.0
-}
inheritOutputNotInDirectory :: (InheritOutputNotInDirectory s) => proxy s -> ()
inheritOutputNotInDirectory _ =
()