{-# OPTIONS_GHC -Wall #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE LambdaCase #-}

module Control.Process.Handle(
  HasHandle(..)
, AsHandle(..)
) where

import Control.Category(id)
import Control.Lens ( prism', Lens', Prism' )
import Data.Maybe ( Maybe(Nothing, Just) )
import System.IO ( Handle )
import System.Process ( StdStream(UseHandle) )

class HasHandle a where
  handle ::
    Lens' a Handle

instance HasHandle Handle where
  handle :: (Handle -> f Handle) -> Handle -> f Handle
handle =
    (Handle -> f Handle) -> Handle -> f Handle
forall k (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id

class AsHandle a where
  _Handle ::
    Prism' a Handle

instance AsHandle Handle where
  _Handle :: p Handle (f Handle) -> p Handle (f Handle)
_Handle =
    p Handle (f Handle) -> p Handle (f Handle)
forall k (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id

instance AsHandle StdStream where
  _Handle :: p Handle (f Handle) -> p StdStream (f StdStream)
_Handle =
    (Handle -> StdStream)
-> (StdStream -> Maybe Handle) -> Prism' StdStream Handle
forall b s a. (b -> s) -> (s -> Maybe a) -> Prism s s a b
prism'
      Handle -> StdStream
UseHandle
      (\case
        UseHandle Handle
a -> Handle -> Maybe Handle
forall a. a -> Maybe a
Just Handle
a
        StdStream
_ -> Maybe Handle
forall a. Maybe a
Nothing
      )