{-# LANGUAGE CPP #-}
{-# LANGUAGE UndecidableInstances #-}

-- | Provides 'PathSizeResult' type.
--
-- @since 0.1
module PathSize.Data.PathSizeResult
  ( PathSizeResult (..),
    mkPathE,
    mkPathEString,
    _PathSizeSuccess,
    _PathSizePartial,
    _PathSizeFailure,
  )
where

import Control.DeepSeq (NFData)
import Control.Exception (Exception)
import Data.Sequence.NonEmpty (NESeq)
import Data.Sequence.NonEmpty qualified as NESeq
import Effects.Exception qualified as Ex
import Effects.FileSystem.OsPath (OsPath)
import GHC.Generics (Generic)
import Optics.Core (Prism', prism)
import PathSize.Exception (PathE (MkPathE))

-- | Result of running a path-size computation with multiple notions of
-- failure.
--
-- @since 0.1
data PathSizeResult a
  = -- | Successfully computed @a@.
    --
    -- @since 0.1
    PathSizeSuccess !a
  | -- | Computed @a@ with some errors.
    --
    -- @since 0.1
    PathSizePartial !(NESeq PathE) !a
  | -- | Failed computing @a@.
    --
    -- @since 0.1
    PathSizeFailure !(NESeq PathE)
  deriving stock
    ( -- | @since 0.1
      PathSizeResult a -> PathSizeResult a -> Bool
(PathSizeResult a -> PathSizeResult a -> Bool)
-> (PathSizeResult a -> PathSizeResult a -> Bool)
-> Eq (PathSizeResult a)
forall a. Eq a => PathSizeResult a -> PathSizeResult a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => PathSizeResult a -> PathSizeResult a -> Bool
== :: PathSizeResult a -> PathSizeResult a -> Bool
$c/= :: forall a. Eq a => PathSizeResult a -> PathSizeResult a -> Bool
/= :: PathSizeResult a -> PathSizeResult a -> Bool
Eq,
      -- | @since 0.1
      (forall a b. (a -> b) -> PathSizeResult a -> PathSizeResult b)
-> (forall a b. a -> PathSizeResult b -> PathSizeResult a)
-> Functor PathSizeResult
forall a b. a -> PathSizeResult b -> PathSizeResult a
forall a b. (a -> b) -> PathSizeResult a -> PathSizeResult b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> PathSizeResult a -> PathSizeResult b
fmap :: forall a b. (a -> b) -> PathSizeResult a -> PathSizeResult b
$c<$ :: forall a b. a -> PathSizeResult b -> PathSizeResult a
<$ :: forall a b. a -> PathSizeResult b -> PathSizeResult a
Functor,
      -- | @since 0.1
      (forall x. PathSizeResult a -> Rep (PathSizeResult a) x)
-> (forall x. Rep (PathSizeResult a) x -> PathSizeResult a)
-> Generic (PathSizeResult a)
forall x. Rep (PathSizeResult a) x -> PathSizeResult a
forall x. PathSizeResult a -> Rep (PathSizeResult a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (PathSizeResult a) x -> PathSizeResult a
forall a x. PathSizeResult a -> Rep (PathSizeResult a) x
$cfrom :: forall a x. PathSizeResult a -> Rep (PathSizeResult a) x
from :: forall x. PathSizeResult a -> Rep (PathSizeResult a) x
$cto :: forall a x. Rep (PathSizeResult a) x -> PathSizeResult a
to :: forall x. Rep (PathSizeResult a) x -> PathSizeResult a
Generic,
      -- | @since 0.1
      Int -> PathSizeResult a -> ShowS
[PathSizeResult a] -> ShowS
PathSizeResult a -> String
(Int -> PathSizeResult a -> ShowS)
-> (PathSizeResult a -> String)
-> ([PathSizeResult a] -> ShowS)
-> Show (PathSizeResult a)
forall a. Show a => Int -> PathSizeResult a -> ShowS
forall a. Show a => [PathSizeResult a] -> ShowS
forall a. Show a => PathSizeResult a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> PathSizeResult a -> ShowS
showsPrec :: Int -> PathSizeResult a -> ShowS
$cshow :: forall a. Show a => PathSizeResult a -> String
show :: PathSizeResult a -> String
$cshowList :: forall a. Show a => [PathSizeResult a] -> ShowS
showList :: [PathSizeResult a] -> ShowS
Show
    )
  deriving anyclass
    ( -- | @since 0.1
      PathSizeResult a -> ()
(PathSizeResult a -> ()) -> NFData (PathSizeResult a)
forall a. NFData a => PathSizeResult a -> ()
forall a. (a -> ()) -> NFData a
$crnf :: forall a. NFData a => PathSizeResult a -> ()
rnf :: PathSizeResult a -> ()
NFData
    )

-- | @since 0.1
_PathSizeSuccess :: Prism' (PathSizeResult a) a
_PathSizeSuccess :: forall a. Prism' (PathSizeResult a) a
_PathSizeSuccess =
  (a -> PathSizeResult a)
-> (PathSizeResult a -> Either (PathSizeResult a) a)
-> Prism (PathSizeResult a) (PathSizeResult a) a a
forall b t s a. (b -> t) -> (s -> Either t a) -> Prism s t a b
prism
    a -> PathSizeResult a
forall a. a -> PathSizeResult a
PathSizeSuccess
    ( \PathSizeResult a
x -> case PathSizeResult a
x of
        PathSizeSuccess a
a -> a -> Either (PathSizeResult a) a
forall a b. b -> Either a b
Right a
a
        PathSizeResult a
_ -> PathSizeResult a -> Either (PathSizeResult a) a
forall a b. a -> Either a b
Left PathSizeResult a
x
    )
{-# INLINE _PathSizeSuccess #-}

-- | @since 0.1
_PathSizePartial :: Prism' (PathSizeResult a) (NESeq PathE, a)
_PathSizePartial :: forall a. Prism' (PathSizeResult a) (NESeq PathE, a)
_PathSizePartial =
  ((NESeq PathE, a) -> PathSizeResult a)
-> (PathSizeResult a -> Either (PathSizeResult a) (NESeq PathE, a))
-> Prism
     (PathSizeResult a)
     (PathSizeResult a)
     (NESeq PathE, a)
     (NESeq PathE, a)
forall b t s a. (b -> t) -> (s -> Either t a) -> Prism s t a b
prism
    ((NESeq PathE -> a -> PathSizeResult a)
-> (NESeq PathE, a) -> PathSizeResult a
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry NESeq PathE -> a -> PathSizeResult a
forall a. NESeq PathE -> a -> PathSizeResult a
PathSizePartial)
    ( \PathSizeResult a
x -> case PathSizeResult a
x of
        PathSizePartial NESeq PathE
errs a
a -> (NESeq PathE, a) -> Either (PathSizeResult a) (NESeq PathE, a)
forall a b. b -> Either a b
Right (NESeq PathE
errs, a
a)
        PathSizeResult a
_ -> PathSizeResult a -> Either (PathSizeResult a) (NESeq PathE, a)
forall a b. a -> Either a b
Left PathSizeResult a
x
    )
{-# INLINE _PathSizePartial #-}

-- | @since 0.1
_PathSizeFailure :: Prism' (PathSizeResult a) (NESeq PathE)
_PathSizeFailure :: forall a. Prism' (PathSizeResult a) (NESeq PathE)
_PathSizeFailure =
  (NESeq PathE -> PathSizeResult a)
-> (PathSizeResult a -> Either (PathSizeResult a) (NESeq PathE))
-> Prism
     (PathSizeResult a) (PathSizeResult a) (NESeq PathE) (NESeq PathE)
forall b t s a. (b -> t) -> (s -> Either t a) -> Prism s t a b
prism
    NESeq PathE -> PathSizeResult a
forall a. NESeq PathE -> PathSizeResult a
PathSizeFailure
    ( \PathSizeResult a
x -> case PathSizeResult a
x of
        PathSizeFailure NESeq PathE
errs -> NESeq PathE -> Either (PathSizeResult a) (NESeq PathE)
forall a b. b -> Either a b
Right NESeq PathE
errs
        PathSizeResult a
_ -> PathSizeResult a -> Either (PathSizeResult a) (NESeq PathE)
forall a b. a -> Either a b
Left PathSizeResult a
x
    )
{-# INLINE _PathSizeFailure #-}

{- ORMOLU_DISABLE -}

-- | @since 0.1
mkPathE :: (Exception e) => OsPath -> e -> PathSizeResult a
mkPathE :: forall e a. Exception e => OsPath -> e -> PathSizeResult a
mkPathE OsPath
path = OsPath -> String -> PathSizeResult a
forall a. OsPath -> String -> PathSizeResult a
mkPathEString OsPath
path (String -> PathSizeResult a)
-> (e -> String) -> e -> PathSizeResult a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> String
displayFn
  where
    displayFn :: e -> String
displayFn =
#if MIN_VERSION_base(4, 20, 0)
      Ex.displayInner
#else
      e -> String
forall e. Exception e => e -> String
Ex.displayNoCS
#endif

{- ORMOLU_ENABLE -}

mkPathEString :: OsPath -> String -> PathSizeResult a
mkPathEString :: forall a. OsPath -> String -> PathSizeResult a
mkPathEString OsPath
path = NESeq PathE -> PathSizeResult a
forall a. NESeq PathE -> PathSizeResult a
PathSizeFailure (NESeq PathE -> PathSizeResult a)
-> (String -> NESeq PathE) -> String -> PathSizeResult a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PathE -> NESeq PathE
forall a. a -> NESeq a
NESeq.singleton (PathE -> NESeq PathE)
-> (String -> PathE) -> String -> NESeq PathE
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OsPath -> String -> PathE
MkPathE OsPath
path