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