module Effectful.Zoo.DataLog.Data.DataLogger
  ( DataLogger(..),
    mkDataLogger,
  ) where

import Effectful
import Effectful.Dispatch.Static
import HaskellWorks.Prelude

newtype DataLogger i = DataLogger
  { forall i. DataLogger i -> i -> IO ()
run :: i -> IO ()
  } deriving stock (forall x. DataLogger i -> Rep (DataLogger i) x)
-> (forall x. Rep (DataLogger i) x -> DataLogger i)
-> Generic (DataLogger i)
forall x. Rep (DataLogger i) x -> DataLogger i
forall x. DataLogger i -> Rep (DataLogger i) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall i x. Rep (DataLogger i) x -> DataLogger i
forall i x. DataLogger i -> Rep (DataLogger i) x
$cfrom :: forall i x. DataLogger i -> Rep (DataLogger i) x
from :: forall x. DataLogger i -> Rep (DataLogger i) x
$cto :: forall i x. Rep (DataLogger i) x -> DataLogger i
to :: forall x. Rep (DataLogger i) x -> DataLogger i
Generic

instance Contravariant DataLogger where
  contramap :: forall a' a. (a' -> a) -> DataLogger a -> DataLogger a'
contramap a' -> a
f (DataLogger a -> IO ()
g) = (a' -> IO ()) -> DataLogger a'
forall i. (i -> IO ()) -> DataLogger i
DataLogger (a -> IO ()
g (a -> IO ()) -> (a' -> a) -> a' -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a' -> a
f)

mkDataLogger :: ()
  => (i -> Eff r ())
  -> Eff r (DataLogger i)
mkDataLogger :: forall i (r :: [Effect]). (i -> Eff r ()) -> Eff r (DataLogger i)
mkDataLogger i -> Eff r ()
run =
  Persistence
-> Limit
-> ((forall {r}. Eff r r -> IO r) -> IO (DataLogger i))
-> Eff r (DataLogger i)
forall (es :: [Effect]) a.
HasCallStack =>
Persistence
-> Limit -> ((forall r. Eff es r -> IO r) -> IO a) -> Eff es a
unsafeConcUnliftIO Persistence
Persistent Limit
Unlimited (((forall {r}. Eff r r -> IO r) -> IO (DataLogger i))
 -> Eff r (DataLogger i))
-> ((forall {r}. Eff r r -> IO r) -> IO (DataLogger i))
-> Eff r (DataLogger i)
forall a b. (a -> b) -> a -> b
$ \forall {r}. Eff r r -> IO r
effToIO ->
    DataLogger i -> IO (DataLogger i)
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (DataLogger i -> IO (DataLogger i))
-> DataLogger i -> IO (DataLogger i)
forall a b. (a -> b) -> a -> b
$ (i -> IO ()) -> DataLogger i
forall i. (i -> IO ()) -> DataLogger i
DataLogger ((i -> IO ()) -> DataLogger i) -> (i -> IO ()) -> DataLogger i
forall a b. (a -> b) -> a -> b
$ Eff r () -> IO ()
forall {r}. Eff r r -> IO r
effToIO (Eff r () -> IO ()) -> (i -> Eff r ()) -> i -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. i -> Eff r ()
run