module AOC.Util (
strip
, stripNewline
, eitherToMaybe
, firstJust
, maybeToEither
, maybeAlt
, traceShowIdMsg
, traceShowMsg
) where
import Control.Applicative
import Control.Monad.Except
import Data.Foldable
import Debug.Trace
import qualified Data.Text as T
strip :: String -> String
strip = T.unpack . T.strip . T.pack
stripNewline :: String -> String
stripNewline = reverse . dropWhile (== '\n') . reverse
eitherToMaybe :: Alternative m => Either e a -> m a
eitherToMaybe = either (const empty) pure
maybeToEither :: MonadError e m => e -> Maybe a -> m a
maybeToEither e = maybe (throwError e) pure
firstJust
:: Foldable t
=> (a -> Maybe b)
-> t a
-> Maybe b
firstJust p = asum . map p . toList
maybeAlt :: Alternative m => Maybe a -> m a
maybeAlt = maybe empty pure
traceShowIdMsg :: Show a => String -> a -> a
traceShowIdMsg msg x = trace (msg ++ show x) x
traceShowMsg :: Show a => String -> a -> b -> b
traceShowMsg msg x = trace (msg ++ show x)