module Tgraph.Try
(
Try
, onFail
, nothingFail
, runTry
, ifFail
, isFail
, concatFails
, ignoreFails
, atLeastOne
, noFails
) where
import Data.Either(fromRight, lefts, rights, isLeft)
type Try a = Either String a
onFail:: String -> Try a -> Try a
onFail :: forall a. String -> Try a -> Try a
onFail String
s = (String -> Try a) -> (a -> Try a) -> Try a -> Try a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (String -> Try a
forall a b. a -> Either a b
Left (String -> Try a) -> (String -> String) -> String -> Try a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String
sString -> String -> String
forall a. [a] -> [a] -> [a]
++)) a -> Try a
forall a b. b -> Either a b
Right
nothingFail :: Maybe b -> String -> Try b
nothingFail :: forall b. Maybe b -> String -> Try b
nothingFail Maybe b
a String
s = Try b -> (b -> Try b) -> Maybe b -> Try b
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (String -> Try b
forall a b. a -> Either a b
Left String
s) b -> Try b
forall a b. b -> Either a b
Right Maybe b
a
runTry:: Try a -> a
runTry :: forall a. Try a -> a
runTry = (String -> a) -> (a -> a) -> Either String a -> a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either String -> a
forall a. HasCallStack => String -> a
error a -> a
forall a. a -> a
id
ifFail :: a -> Try a -> a
ifFail :: forall a. a -> Try a -> a
ifFail = a -> Either String a -> a
forall b a. b -> Either a b -> b
fromRight
isFail:: Try a -> Bool
isFail :: forall a. Try a -> Bool
isFail = Either String a -> Bool
forall a b. Either a b -> Bool
isLeft
concatFails:: [Try a] -> Try [a]
concatFails :: forall a. [Try a] -> Try [a]
concatFails [Try a]
ls = case [Try a] -> [String]
forall a b. [Either a b] -> [a]
lefts [Try a]
ls of
[] -> [a] -> Try [a]
forall a b. b -> Either a b
Right ([a] -> Try [a]) -> [a] -> Try [a]
forall a b. (a -> b) -> a -> b
$ [Try a] -> [a]
forall a b. [Either a b] -> [b]
rights [Try a]
ls
[String]
other -> String -> Try [a]
forall a b. a -> Either a b
Left (String -> Try [a]) -> String -> Try [a]
forall a b. (a -> b) -> a -> b
$ [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String]
other
ignoreFails:: [Try a] -> [a]
ignoreFails :: forall a. [Try a] -> [a]
ignoreFails = [Either String a] -> [a]
forall a b. [Either a b] -> [b]
rights
atLeastOne:: [Try a] -> [a]
atLeastOne :: forall a. [Try a] -> [a]
atLeastOne [] = String -> [a]
forall a. HasCallStack => String -> a
error String
"atLeastOne: applied to empty list.\n"
atLeastOne [Try a]
results = case [Try a] -> [a]
forall a. [Try a] -> [a]
ignoreFails [Try a]
results of
[] -> Try [a] -> [a]
forall a. Try a -> a
runTry (Try [a] -> [a]) -> Try [a] -> [a]
forall a b. (a -> b) -> a -> b
$ String -> Try [a] -> Try [a]
forall a. String -> Try a -> Try a
onFail String
"atLeastOne: no successful results.\n" (Try [a] -> Try [a]) -> Try [a] -> Try [a]
forall a b. (a -> b) -> a -> b
$ [Try a] -> Try [a]
forall a. [Try a] -> Try [a]
concatFails [Try a]
results
[a]
other -> [a]
other
noFails:: [Try a] -> [a]
noFails :: forall a. [Try a] -> [a]
noFails = Try [a] -> [a]
forall a. Try a -> a
runTry (Try [a] -> [a]) -> ([Try a] -> Try [a]) -> [Try a] -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Try a] -> Try [a]
forall a. [Try a] -> Try [a]
concatFails