packages feed

enum-text-rio-1.0.0.0: app/demo-enum-text-rio.hs

{-# LANGUAGE DeriveAnyClass    #-}
{-# LANGUAGE DerivingVia       #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}


import           RIO
import           Text.Enum.RIO.Fmt


data Foo = FOO_bar | FOO_bar_baz
  deriving (Bounded,Enum,EnumText,Eq,Ord,Show)
  deriving (Buildable,Display,TextParsable) via UsingEnumText  Foo


main :: IO ()
main = run $ test [minBound..maxBound]

test :: [Foo] -> RIO Env ()
test []         = return ()
test (foo:foos) = do
    logInfo $ fmt $ "hello "+|foo|+""
    test foos

--
-- RIO setup
--

data Env =
  Env
    { _env_lf :: LogFunc
    }

instance HasLogFunc Env where
  logFuncL = lens
    _env_lf
    (\x y -> x { _env_lf = y })

run :: RIO Env a -> IO a
run bdy = rio_log_func $ \lf -> runRIO (Env lf) bdy

rio_log_func :: (LogFunc -> IO a) -> IO a
rio_log_func cb = do
    lo <- opts <$> logOptionsHandle stdout is_logging
    withLogFunc lo cb
  where
    opts =
      setLogVerboseFormat   True
      . setLogUseTime       True
      . setLogUseLoc        False
      . setLogMinLevel      LevelDebug

    is_logging = True