{-# options_haddock prune #-}

-- |The effect 'SystemProcess' is a low-level abstraction of a native system process.
module Polysemy.Process.SystemProcess (
  module Polysemy.Process.Effect.SystemProcess,
  module Polysemy.Process.Interpreter.SystemProcess,
  module Polysemy.Process.SysProcConf,
  currentPid,
) where

import System.Posix (getProcessID)

import Polysemy.Process.Data.Pid (Pid)
import Polysemy.Process.Effect.SystemProcess (
  SystemProcess,
  interrupt,
  pid,
  readStderr,
  readStdout,
  signal,
  wait,
  withSystemProcess,
  writeStdin,
  )
import Polysemy.Process.Interpreter.SystemProcess (
  SysProcConf,
  interpretSystemProcessNative,
  interpretSystemProcessNativeSingle,
  interpretSystemProcessWithProcess,
  )
import Polysemy.Process.SysProcConf

-- |Obtain the current process's 'Pid'.
currentPid ::
  Member (Embed IO) r =>
  Sem r Pid
currentPid :: forall (r :: EffectRow). Member (Embed IO) r => Sem r Pid
currentPid =
  ProcessID -> Pid
forall a b. (Integral a, Num b) => a -> b
fromIntegral (ProcessID -> Pid) -> Sem r ProcessID -> Sem r Pid
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO ProcessID -> Sem r ProcessID
forall (m :: * -> *) (r :: EffectRow) a.
Member (Embed m) r =>
m a -> Sem r a
embed IO ProcessID
getProcessID