packages feed

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