never executed always true always false
    1 module HelVM.HelIO.Extra where
    2 
    3 import           Control.Type.Operator
    4 
    5 import           Data.Char             hiding (chr)
    6 import           Data.Default
    7 import           Data.Typeable
    8 import           Text.Pretty.Simple
    9 
   10 import qualified Data.Text             as Text
   11 
   12 -- | FilesExtra
   13 
   14 readFileTextUtf8 :: MonadIO m => FilePath -> m Text
   15 readFileTextUtf8 = (pure <$> decodeUtf8) <=< readFileBS
   16 
   17 -- | TextExtra
   18 
   19 toUppers :: Text -> Text
   20 toUppers = Text.map toUpper
   21 
   22 splitOneOf :: String -> Text -> [Text]
   23 splitOneOf s = Text.split contains where contains c = c `elem` s
   24 
   25 -- | ShowExtra
   26 
   27 showP :: Show a => a -> Text
   28 showP = toText <$> pShowNoColor
   29 
   30 showToText :: (Typeable a , Show a) => a -> Text
   31 showToText a = show a `fromMaybe` (cast a :: Maybe Text)
   32 
   33 -- | CharExtra
   34 
   35 genericChr :: Integral a => a -> Char
   36 genericChr = chr <$> fromIntegral
   37 
   38 -- | MaybeExtra
   39 
   40 infixr 0 ???
   41 (???) :: Maybe a -> a -> a
   42 (???) = flip fromMaybe
   43 
   44 fromMaybeOrDef :: Default a => Maybe a -> a
   45 fromMaybeOrDef = fromMaybe def
   46 
   47 headMaybe :: [a] -> Maybe a
   48 headMaybe = viaNonEmpty head
   49 
   50 fromJustWith :: Show e => e -> Maybe a -> a
   51 fromJustWith e = fromJustWithText (show e)
   52 
   53 fromJustWithText :: Text -> Maybe a -> a
   54 fromJustWithText t Nothing  = error t
   55 fromJustWithText _ (Just a) = a
   56 
   57 toMaybe :: Bool -> a -> Maybe a
   58 toMaybe False _ = Nothing
   59 toMaybe True  x = Just x
   60 
   61 -- | ListExtra
   62 
   63 unfoldrM :: Monad m => (a -> m (Maybe (b, a))) -> a -> m [b]
   64 unfoldrM f = go <=< f where
   65   go  Nothing       = pure []
   66   go (Just (b, a')) = (b : ) <$> (go <=< f) a'
   67 
   68 --unfoldr :: (a ->  Maybe (b, a)) -> a -> [b]
   69 --unfoldr f = runIdentity <$> unfoldrM (Identity <$> f)
   70 
   71 runParser :: Monad m => Parser a b m -> [a] -> m [b]
   72 runParser f = go where
   73   go [] = pure []
   74   go a  = (build <=< f) a where build (b, a') = (b : ) <$> go a'
   75 
   76 repeatedlyM :: Monad m => Parser a b m -> [a] -> m [b]
   77 repeatedlyM = runParser
   78 
   79 repeatedly :: ([a] -> (b, [a])) -> [a] -> [b]
   80 repeatedly f = runIdentity <$> repeatedlyM (Identity <$> f)
   81 
   82 -- | NonEmptyExtra
   83 
   84 many1' :: (Monad f, Alternative f) => f a -> f $ NonEmpty a
   85 many1' p = liftA2 (:|) p $ many p
   86 
   87 -- | Extra
   88 
   89 -- | `tee` is deprecated, use `<*>`
   90 tee :: (a -> b -> c) -> (a -> b) -> a -> c
   91 tee f1 f2 a = (f1 a <$> f2) a
   92 
   93 type Act s a = s -> Either s a
   94 type ActM m s a = s -> m (Either s a)
   95 type Parser a b m = [a] -> m (b, [a])