packages feed

effectful-zoo-0.0.2.0: components/core/Effectful/Zoo/DataLog/Data/DataLogger.hs

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

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

newtype DataLogger i = DataLogger
  { run :: i -> IO ()
  } deriving stock Generic

instance Contravariant DataLogger where
  contramap f (DataLogger g) = DataLogger (g . f)

mkDataLogger :: ()
  => (i -> Eff r ())
  -> Eff r (DataLogger i)
mkDataLogger run =
  unsafeConcUnliftIO Persistent Unlimited $ \effToIO ->
    pure $ DataLogger $ effToIO . run