module Effectful.Posix.Signals.Handler
  ( Handler (..),
    mapHandler,
    handlerToPosix,
    handlerFromPosix,
  )
where

import System.Posix.Signals (SignalInfo)
import System.Posix.Signals qualified as Signals

-- | @since 0.1
data Handler m
  = Default
  | Ignore
  | Catch (m ())
  | CatchOnce (m ())
  | CatchInfo (SignalInfo -> m ())
  | CatchInfoOnce (SignalInfo -> m ())

-- | @since 0.1
mapHandler :: (forall x. m x -> n x) -> Handler m -> Handler n
mapHandler :: forall (m :: * -> *) (n :: * -> *).
(forall x. m x -> n x) -> Handler m -> Handler n
mapHandler forall x. m x -> n x
f = \case
  Handler m
Default -> Handler n
forall (m :: * -> *). Handler m
Default
  Handler m
Ignore -> Handler n
forall (m :: * -> *). Handler m
Ignore
  Catch m ()
x -> n () -> Handler n
forall (m :: * -> *). m () -> Handler m
Catch (n () -> Handler n) -> n () -> Handler n
forall a b. (a -> b) -> a -> b
$ m () -> n ()
forall x. m x -> n x
f m ()
x
  CatchOnce m ()
x -> n () -> Handler n
forall (m :: * -> *). m () -> Handler m
CatchOnce (n () -> Handler n) -> n () -> Handler n
forall a b. (a -> b) -> a -> b
$ m () -> n ()
forall x. m x -> n x
f m ()
x
  CatchInfo SignalInfo -> m ()
x -> (SignalInfo -> n ()) -> Handler n
forall (m :: * -> *). (SignalInfo -> m ()) -> Handler m
CatchInfo ((SignalInfo -> n ()) -> Handler n)
-> (SignalInfo -> n ()) -> Handler n
forall a b. (a -> b) -> a -> b
$ m () -> n ()
forall x. m x -> n x
f (m () -> n ()) -> (SignalInfo -> m ()) -> SignalInfo -> n ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SignalInfo -> m ()
x
  CatchInfoOnce SignalInfo -> m ()
x -> (SignalInfo -> n ()) -> Handler n
forall (m :: * -> *). (SignalInfo -> m ()) -> Handler m
CatchInfoOnce ((SignalInfo -> n ()) -> Handler n)
-> (SignalInfo -> n ()) -> Handler n
forall a b. (a -> b) -> a -> b
$ m () -> n ()
forall x. m x -> n x
f (m () -> n ()) -> (SignalInfo -> m ()) -> SignalInfo -> n ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SignalInfo -> m ()
x

-- | @since 0.1
handlerToPosix :: Handler IO -> Signals.Handler
handlerToPosix :: Handler IO -> Handler
handlerToPosix = \case
  Handler IO
Default -> Handler
Signals.Default
  Handler IO
Ignore -> Handler
Signals.Ignore
  Catch IO ()
x -> IO () -> Handler
Signals.Catch IO ()
x
  CatchOnce IO ()
x -> IO () -> Handler
Signals.CatchOnce IO ()
x
  CatchInfo SignalInfo -> IO ()
x -> (SignalInfo -> IO ()) -> Handler
Signals.CatchInfo SignalInfo -> IO ()
x
  CatchInfoOnce SignalInfo -> IO ()
x -> (SignalInfo -> IO ()) -> Handler
Signals.CatchInfoOnce SignalInfo -> IO ()
x

-- | @since 0.1
handlerFromPosix :: Signals.Handler -> Handler IO
handlerFromPosix :: Handler -> Handler IO
handlerFromPosix = \case
  Handler
Signals.Default -> Handler IO
forall (m :: * -> *). Handler m
Default
  Handler
Signals.Ignore -> Handler IO
forall (m :: * -> *). Handler m
Ignore
  Signals.Catch IO ()
x -> IO () -> Handler IO
forall (m :: * -> *). m () -> Handler m
Catch IO ()
x
  Signals.CatchOnce IO ()
x -> IO () -> Handler IO
forall (m :: * -> *). m () -> Handler m
CatchOnce IO ()
x
  Signals.CatchInfo SignalInfo -> IO ()
x -> (SignalInfo -> IO ()) -> Handler IO
forall (m :: * -> *). (SignalInfo -> m ()) -> Handler m
CatchInfo SignalInfo -> IO ()
x
  Signals.CatchInfoOnce SignalInfo -> IO ()
x -> (SignalInfo -> IO ()) -> Handler IO
forall (m :: * -> *). (SignalInfo -> m ()) -> Handler m
CatchInfoOnce SignalInfo -> IO ()
x