diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+1.2.2.0 [2024-03-20]
+--------------------
+* Mini.Transformers.ParserT:
+    * Add combinator 'reject'
+    * Add combinator 'accept'
+
 1.2.1.0 [2024-03-16]
 --------------------
 * Add Mini.Transformers.ReaderT.local
diff --git a/Mini/Transformers/ParserT.hs b/Mini/Transformers/ParserT.hs
--- a/Mini/Transformers/ParserT.hs
+++ b/Mini/Transformers/ParserT.hs
@@ -33,6 +33,8 @@
   chainr1,
   between,
   option,
+  reject,
+  accept,
 ) where
 
 import Control.Applicative (
@@ -79,6 +81,7 @@
   pure a = ParserT $ pure . Right . (a,)
   (<*>) = ap
 
+-- | TODO
 instance (Monad m, Eq s) => Alternative (ParserT s m) where
   empty = ParserT . const . pure $ Left mempty
   m <|> n = ParserT $ \ss ->
@@ -103,6 +106,7 @@
 instance MonadTrans (ParserT s) where
   lift m = ParserT $ \ss -> m <&> Right . (,ss)
 
+-- | Combine the results of @p@ and @q@ via @p <> q@
 instance (Monad m, Semigroup a) => Semigroup (ParserT s m a) where
   m <> n = (<>) <$> m <*> n
 
@@ -123,7 +127,13 @@
  - Parsers
  -}
 
--- | Parse symbols satisfying a predicate
+{- | Parse symbols satisfying a predicate
+
+=== __Examples__
+
+>>> runParserT (string "foe" <|> string "foo") "foobar"
+Right ("foo","bar")
+-}
 sat :: (Applicative m, Show s) => (s -> Bool) -> ParserT s m s
 sat p = ParserT $ \case
   [] -> pure . Left $ ParseError ["end of input"]
@@ -133,11 +143,23 @@
       (pure $ Right (s, ss))
       $ p s
 
--- | Parse any symbol
+{- | Parse any symbol
+
+=== __Examples__
+
+>>> runParserT (item *> item <* item) "bar"
+Right ('a',"")
+-}
 item :: (Applicative m, Show s) => ParserT s m s
 item = sat $ const True
 
--- | Parse a symbol
+{- | Parse a symbol
+
+=== __Examples__
+
+>>> runParserT (EXAMPLE) "STRING"
+Right (RESULT,"REST")
+-}
 symbol :: (Applicative m, Show s, Eq s) => s -> ParserT s m s
 symbol = sat . (==)
 
@@ -154,10 +176,8 @@
 noneOf = sat . flip notElem
 
 -- | Parse successfully only at end of input
-eof :: (Applicative m, Show s) => ParserT s m ()
-eof = ParserT $ \case
-  [] -> pure $ Right ((), [])
-  (s : _) -> pure . Left $ ParseError ["unexpected " <> show s]
+eof :: (Monad m, Show s) => ParserT s m ()
+eof = reject item
 
 {-
  - Combinators
@@ -230,3 +250,19 @@
 -- | Parse @p@ returning @a@ in case of failure via @option a p@
 option :: (Monad m, Eq s) => a -> ParserT s m a -> ParserT s m a
 option a p = p <|> pure a
+
+-- | Parse @p@, without consuming input, iff @p@ fails via @reject p@
+reject :: (Monad m, Show a) => ParserT s m a -> ParserT s m ()
+reject p = ParserT $ \ss ->
+  runParserT p ss
+    >>= either
+      (const . pure $ Right ((), ss))
+      (pure . Left . ParseError . pure . mappend "unexpected " . show . fst)
+
+-- | Parse @p@, without consuming input, iff @p@ succeeds via @accept p@
+accept :: (Monad m) => ParserT s m a -> ParserT s m a
+accept p = ParserT $ \ss ->
+  runParserT p ss
+    >>= either
+      (pure . Left)
+      (pure . Right . (,ss) . fst)
diff --git a/mini.cabal b/mini.cabal
--- a/mini.cabal
+++ b/mini.cabal
@@ -1,6 +1,6 @@
 cabal-version:      2.4
 name:               mini
-version:            1.2.1.0
+version:            1.2.2.0
 license:            MIT
 license-file:       LICENSE
 copyright:          (c) 2023-2024 Victor Wallsten
