punctuationToken :: (ErrorComponent e) => ParsecT e String (Reader (Dictionary a)) (EngToken a)
punctuationToken = do
  st <- getParserState
  ch <- oneOf (",;.?"::[Char]) <?> "punctuation"
  let
    tmap = if | ch == ',' -> Comma
              | ch == ';' -> Semicolon
              | ch == '.' -> Period
              | ch == '?' -> QuestionMark
  return . tmap . NE.head $ statePos st
punctuationToken :: (ErrorComponent e) => ParsecT e String (Reader (Dictionary a)) (EngToken a)
punctuationToken = do
  st <- getParserState
  ch <- oneOf (",;.?"::[Char]) <?> "punctuation"
  let
    tmap = if | ch == ',' -> Comma
              | ch == ';' -> Semicolon
              | ch == '.' -> Period
              | ch == '?' -> QuestionMark
  return . tmap . NE.head $ statePos st
punctuationToken = do
  st <- getParserState
  ch <- oneOf (",;.?"::[Char]) <?> "punctuation"
  let
    tmap = if | ch == ',' -> Comma
              | ch == ';' -> Semicolon
              | ch == '.' -> Period
              | ch == '?' -> QuestionMark
  return . tmap . NE.head $ statePos st