never executed always true always false
    1 module HelVM.HelMA.Automaton.ReadPExtra where
    2 
    3 import           HelVM.HelMA.Automaton.API.IOTypes
    4 
    5 import           HelVM.HelIO.Control.Safe
    6 
    7 import           Control.Type.Operator
    8 
    9 import           Data.Char
   10 
   11 import           Text.ParserCombinators.ReadP      hiding (many)
   12 
   13 runParser :: MonadSafe m => ReadP a -> Source -> m a
   14 runParser parser source = fst . last <$> nonEmptyRunParser parser source
   15 
   16 nonEmptyRunParser :: MonadSafe m => ReadP a -> Source -> m $ NonEmpty (a , String)
   17 nonEmptyRunParser parser source = nonEmptyFromList ("Cannot parse source\n" <> source) $ listRunParser parser source
   18 
   19 listRunParser :: ReadP a -> Source -> [(a , String)]
   20 listRunParser parser = readP_to_S parser . toString
   21 
   22 -- | Parsers
   23 
   24 oneOf :: String -> ReadP Char
   25 oneOf cs = satisfy (`elem` cs)
   26 
   27 notChar :: Char -> ReadP Char
   28 notChar c = satisfy (/= c)
   29 
   30 anyChar :: ReadP Char
   31 anyChar = satisfy $ const True
   32 
   33 digit :: ReadP Char
   34 digit = satisfy isDigit
   35 
   36 letterAscii :: ReadP Char
   37 letterAscii = satisfy isAlphaAscii
   38 
   39 -- | Extra
   40 
   41 isAlphaAscii :: Char -> Bool
   42 isAlphaAscii c = isAsciiLower c || isAsciiUpper c
   43 
   44 manyNonEmpty :: Alternative f => f a -> f $ NonEmpty a
   45 manyNonEmpty p = liftA2 (:|) p (many p)