packages feed

tools-yj-0.1.0.19: src/Data/Maybe/ToolsYj.hs

{-# LANGUAGE BlockArguments, LambdaCase #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Data.Maybe.ToolsYj (
	forceJust, forceJust', orErrorIO, findMaybe, findMaybeM ) where

import Control.Exception

forceJust :: Exception e => e -> Maybe a -> a
forceJust e = maybe (throw e) id

forceJust' :: String -> Maybe a -> a
forceJust' = forceJust . ErrorCall

orErrorIO :: String -> Maybe a -> IO a
orErrorIO msg = maybe (error msg) pure

findMaybe :: (a -> Maybe b) -> [a] -> Maybe (a, b)
findMaybe prd = \case
	[] -> Nothing
	p : ps -> ($ prd p) \case
		Nothing -> findMaybe prd ps; Just x -> Just (p, x)

findMaybeM :: Monad m => (a -> m (Maybe b)) -> [a] -> m (Maybe (a, b))
findMaybeM prd = \case
	[] -> pure Nothing
	p : ps -> prd p >>= \case
		Nothing -> findMaybeM prd ps; Just x -> pure $ Just (p, x)