{-# options_haddock prune #-}

-- |Description: Process Interpreters for stdio, Internal
module Polysemy.Process.Interpreter.ProcessStdio where

import Polysemy.Conc.Effect.Race (Race)
import Polysemy.Conc.Effect.Scoped (Scoped)
import Polysemy.Resume (type (!!))
import System.Process.Typed (ProcessConfig)

import Polysemy.Process.Data.ProcessError (ProcessError)
import Polysemy.Process.Data.ProcessOptions (ProcessOptions)
import Polysemy.Process.Data.SystemProcessError (SystemProcessError)
import Polysemy.Process.Effect.Process (Process)
import Polysemy.Process.Interpreter.Process (
  interpretProcessByteString,
  interpretProcessByteStringLines,
  interpretProcessText,
  interpretProcessTextLines,
  )
import Polysemy.Process.Interpreter.SystemProcess (PipesProcess, interpretSystemProcessNative)

-- |Interpret 'Process' as a native 'Polysemy.Process.SystemProcess', producing unaccumulated chunks of 'ByteString'.
-- Silently discards stderr.
interpretProcessByteStringNative ::
  Members [Resource, Race, Async, Embed IO] r =>
  ProcessOptions ->
  -- |Basic config. The pipes will be changed to 'System.IO.Handle' by the interpreter.
  ProcessConfig () () () ->
  InterpreterFor (Scoped () (Process ByteString ByteString) !! ProcessError) r
interpretProcessByteStringNative :: forall (r :: [(* -> *) -> * -> *]).
Members '[Resource, Race, Async, Embed IO] r =>
ProcessOptions
-> ProcessConfig () () ()
-> InterpreterFor
     (Scoped () (Process ByteString ByteString) !! ProcessError) r
interpretProcessByteStringNative ProcessOptions
options ProcessConfig () () ()
conf =
  ProcessConfig () () ()
-> InterpreterFor
     (Scoped PipesProcess (SystemProcess !! SystemProcessError)) r
forall (r :: [(* -> *) -> * -> *]).
Members '[Resource, Embed IO] r =>
ProcessConfig () () ()
-> InterpreterFor
     (Scoped PipesProcess (SystemProcess !! SystemProcessError)) r
interpretSystemProcessNative ProcessConfig () () ()
conf (Sem
   (Scoped PipesProcess (SystemProcess !! SystemProcessError) : r) a
 -> Sem r a)
-> (Sem
      ((Scoped () (Process ByteString ByteString) !! ProcessError) : r) a
    -> Sem
         (Scoped PipesProcess (SystemProcess !! SystemProcessError) : r) a)
-> Sem
     ((Scoped () (Process ByteString ByteString) !! ProcessError) : r) a
-> Sem r a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  forall resource err (r :: [(* -> *) -> * -> *]).
Members
  '[Scoped resource (SystemProcess !! err), Resource, Race, Async,
    Embed IO]
  r =>
ProcessOptions
-> InterpreterFor
     (Scoped () (Process ByteString ByteString) !! ProcessError) r
interpretProcessByteString @PipesProcess @SystemProcessError ProcessOptions
options (Sem
   ((Scoped () (Process ByteString ByteString) !! ProcessError)
      : Scoped PipesProcess (SystemProcess !! SystemProcessError) : r)
   a
 -> Sem
      (Scoped PipesProcess (SystemProcess !! SystemProcessError) : r) a)
-> (Sem
      ((Scoped () (Process ByteString ByteString) !! ProcessError) : r) a
    -> Sem
         ((Scoped () (Process ByteString ByteString) !! ProcessError)
            : Scoped PipesProcess (SystemProcess !! SystemProcessError) : r)
         a)
-> Sem
     ((Scoped () (Process ByteString ByteString) !! ProcessError) : r) a
-> Sem
     (Scoped PipesProcess (SystemProcess !! SystemProcessError) : r) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Sem
  ((Scoped () (Process ByteString ByteString) !! ProcessError) : r) a
-> Sem
     ((Scoped () (Process ByteString ByteString) !! ProcessError)
        : Scoped PipesProcess (SystemProcess !! SystemProcessError) : r)
     a
forall (e2 :: (* -> *) -> * -> *) (e1 :: (* -> *) -> * -> *)
       (r :: [(* -> *) -> * -> *]) a.
Sem (e1 : r) a -> Sem (e1 : e2 : r) a
raiseUnder

-- |Interpret 'Process' as a native 'Polysemy.Process.SystemProcess', producing lines of 'ByteString'.
-- Silently discards stderr.
interpretProcessByteStringLinesNative ::
  Members [Resource, Race, Async, Embed IO] r =>
  ProcessOptions ->
  -- |Basic config. The pipes will be changed to 'System.IO.Handle' by the interpreter.
  ProcessConfig () () () ->
  InterpreterFor (Scoped () (Process ByteString ByteString) !! ProcessError) r
interpretProcessByteStringLinesNative :: forall (r :: [(* -> *) -> * -> *]).
Members '[Resource, Race, Async, Embed IO] r =>
ProcessOptions
-> ProcessConfig () () ()
-> InterpreterFor
     (Scoped () (Process ByteString ByteString) !! ProcessError) r
interpretProcessByteStringLinesNative ProcessOptions
options ProcessConfig () () ()
conf =
  ProcessConfig () () ()
-> InterpreterFor
     (Scoped PipesProcess (SystemProcess !! SystemProcessError)) r
forall (r :: [(* -> *) -> * -> *]).
Members '[Resource, Embed IO] r =>
ProcessConfig () () ()
-> InterpreterFor
     (Scoped PipesProcess (SystemProcess !! SystemProcessError)) r
interpretSystemProcessNative ProcessConfig () () ()
conf (Sem
   (Scoped PipesProcess (SystemProcess !! SystemProcessError) : r) a
 -> Sem r a)
-> (Sem
      ((Scoped () (Process ByteString ByteString) !! ProcessError) : r) a
    -> Sem
         (Scoped PipesProcess (SystemProcess !! SystemProcessError) : r) a)
-> Sem
     ((Scoped () (Process ByteString ByteString) !! ProcessError) : r) a
-> Sem r a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  forall resource err (r :: [(* -> *) -> * -> *]).
Members
  '[Scoped resource (SystemProcess !! err), Resource, Race, Async,
    Embed IO]
  r =>
ProcessOptions
-> InterpreterFor
     (Scoped () (Process ByteString ByteString) !! ProcessError) r
interpretProcessByteStringLines @PipesProcess @SystemProcessError ProcessOptions
options (Sem
   ((Scoped () (Process ByteString ByteString) !! ProcessError)
      : Scoped PipesProcess (SystemProcess !! SystemProcessError) : r)
   a
 -> Sem
      (Scoped PipesProcess (SystemProcess !! SystemProcessError) : r) a)
-> (Sem
      ((Scoped () (Process ByteString ByteString) !! ProcessError) : r) a
    -> Sem
         ((Scoped () (Process ByteString ByteString) !! ProcessError)
            : Scoped PipesProcess (SystemProcess !! SystemProcessError) : r)
         a)
-> Sem
     ((Scoped () (Process ByteString ByteString) !! ProcessError) : r) a
-> Sem
     (Scoped PipesProcess (SystemProcess !! SystemProcessError) : r) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Sem
  ((Scoped () (Process ByteString ByteString) !! ProcessError) : r) a
-> Sem
     ((Scoped () (Process ByteString ByteString) !! ProcessError)
        : Scoped PipesProcess (SystemProcess !! SystemProcessError) : r)
     a
forall (e2 :: (* -> *) -> * -> *) (e1 :: (* -> *) -> * -> *)
       (r :: [(* -> *) -> * -> *]) a.
Sem (e1 : r) a -> Sem (e1 : e2 : r) a
raiseUnder

-- |Interpret 'Process' as a native 'Polysemy.Process.SystemProcess', producing unaccumulated chunks of 'Text'.
-- Silently discards stderr.
interpretProcessTextNative ::
  Members [Resource, Race, Async, Embed IO] r =>
  ProcessOptions ->
  -- |Basic config. The pipes will be changed to 'System.IO.Handle' by the interpreter.
  ProcessConfig () () () ->
  InterpreterFor (Scoped () (Process Text Text) !! ProcessError) r
interpretProcessTextNative :: forall (r :: [(* -> *) -> * -> *]).
Members '[Resource, Race, Async, Embed IO] r =>
ProcessOptions
-> ProcessConfig () () ()
-> InterpreterFor (Scoped () (Process Text Text) !! ProcessError) r
interpretProcessTextNative ProcessOptions
options ProcessConfig () () ()
conf =
  ProcessConfig () () ()
-> InterpreterFor
     (Scoped PipesProcess (SystemProcess !! SystemProcessError)) r
forall (r :: [(* -> *) -> * -> *]).
Members '[Resource, Embed IO] r =>
ProcessConfig () () ()
-> InterpreterFor
     (Scoped PipesProcess (SystemProcess !! SystemProcessError)) r
interpretSystemProcessNative ProcessConfig () () ()
conf (Sem
   (Scoped PipesProcess (SystemProcess !! SystemProcessError) : r) a
 -> Sem r a)
-> (Sem ((Scoped () (Process Text Text) !! ProcessError) : r) a
    -> Sem
         (Scoped PipesProcess (SystemProcess !! SystemProcessError) : r) a)
-> Sem ((Scoped () (Process Text Text) !! ProcessError) : r) a
-> Sem r a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  forall resource err (r :: [(* -> *) -> * -> *]).
Members
  '[Scoped resource (SystemProcess !! err), Resource, Race, Async,
    Embed IO]
  r =>
ProcessOptions
-> InterpreterFor (Scoped () (Process Text Text) !! ProcessError) r
interpretProcessText @PipesProcess @SystemProcessError ProcessOptions
options (Sem
   ((Scoped () (Process Text Text) !! ProcessError)
      : Scoped PipesProcess (SystemProcess !! SystemProcessError) : r)
   a
 -> Sem
      (Scoped PipesProcess (SystemProcess !! SystemProcessError) : r) a)
-> (Sem ((Scoped () (Process Text Text) !! ProcessError) : r) a
    -> Sem
         ((Scoped () (Process Text Text) !! ProcessError)
            : Scoped PipesProcess (SystemProcess !! SystemProcessError) : r)
         a)
-> Sem ((Scoped () (Process Text Text) !! ProcessError) : r) a
-> Sem
     (Scoped PipesProcess (SystemProcess !! SystemProcessError) : r) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Sem ((Scoped () (Process Text Text) !! ProcessError) : r) a
-> Sem
     ((Scoped () (Process Text Text) !! ProcessError)
        : Scoped PipesProcess (SystemProcess !! SystemProcessError) : r)
     a
forall (e2 :: (* -> *) -> * -> *) (e1 :: (* -> *) -> * -> *)
       (r :: [(* -> *) -> * -> *]) a.
Sem (e1 : r) a -> Sem (e1 : e2 : r) a
raiseUnder

-- |Interpret 'Process' as a native 'Polysemy.Process.SystemProcess', producing lines of 'Text'.
-- Silently discards stderr.
interpretProcessTextLinesNative ::
  Members [Resource, Race, Async, Embed IO] r =>
  ProcessOptions ->
  -- |Basic config. The pipes will be changed to 'System.IO.Handle' by the interpreter.
  ProcessConfig () () () ->
  InterpreterFor (Scoped () (Process Text Text) !! ProcessError) r
interpretProcessTextLinesNative :: forall (r :: [(* -> *) -> * -> *]).
Members '[Resource, Race, Async, Embed IO] r =>
ProcessOptions
-> ProcessConfig () () ()
-> InterpreterFor (Scoped () (Process Text Text) !! ProcessError) r
interpretProcessTextLinesNative ProcessOptions
options ProcessConfig () () ()
conf =
  ProcessConfig () () ()
-> InterpreterFor
     (Scoped PipesProcess (SystemProcess !! SystemProcessError)) r
forall (r :: [(* -> *) -> * -> *]).
Members '[Resource, Embed IO] r =>
ProcessConfig () () ()
-> InterpreterFor
     (Scoped PipesProcess (SystemProcess !! SystemProcessError)) r
interpretSystemProcessNative ProcessConfig () () ()
conf (Sem
   (Scoped PipesProcess (SystemProcess !! SystemProcessError) : r) a
 -> Sem r a)
-> (Sem ((Scoped () (Process Text Text) !! ProcessError) : r) a
    -> Sem
         (Scoped PipesProcess (SystemProcess !! SystemProcessError) : r) a)
-> Sem ((Scoped () (Process Text Text) !! ProcessError) : r) a
-> Sem r a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  forall resource err (r :: [(* -> *) -> * -> *]).
Members
  '[Scoped resource (SystemProcess !! err), Resource, Race, Async,
    Embed IO]
  r =>
ProcessOptions
-> InterpreterFor (Scoped () (Process Text Text) !! ProcessError) r
interpretProcessTextLines @PipesProcess @SystemProcessError ProcessOptions
options (Sem
   ((Scoped () (Process Text Text) !! ProcessError)
      : Scoped PipesProcess (SystemProcess !! SystemProcessError) : r)
   a
 -> Sem
      (Scoped PipesProcess (SystemProcess !! SystemProcessError) : r) a)
-> (Sem ((Scoped () (Process Text Text) !! ProcessError) : r) a
    -> Sem
         ((Scoped () (Process Text Text) !! ProcessError)
            : Scoped PipesProcess (SystemProcess !! SystemProcessError) : r)
         a)
-> Sem ((Scoped () (Process Text Text) !! ProcessError) : r) a
-> Sem
     (Scoped PipesProcess (SystemProcess !! SystemProcessError) : r) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Sem ((Scoped () (Process Text Text) !! ProcessError) : r) a
-> Sem
     ((Scoped () (Process Text Text) !! ProcessError)
        : Scoped PipesProcess (SystemProcess !! SystemProcessError) : r)
     a
forall (e2 :: (* -> *) -> * -> *) (e1 :: (* -> *) -> * -> *)
       (r :: [(* -> *) -> * -> *]) a.
Sem (e1 : r) a -> Sem (e1 : e2 : r) a
raiseUnder