{-# 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 :: Lens' Handle Handle
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 :: Prism' Handle Handle
_Handle =
    forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id

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