diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,7 @@
+0.1.0.5
+
+* change the search functions in `TagTreePosStateT` to use `Maybe` instead of `Bool`
+
 0.1.0.4
 
 * fix bug in breadth/depth first search.
diff --git a/src/Text/HTML/TagSoup/Navigate/Types/TagTreePosState.hs b/src/Text/HTML/TagSoup/Navigate/Types/TagTreePosState.hs
--- a/src/Text/HTML/TagSoup/Navigate/Types/TagTreePosState.hs
+++ b/src/Text/HTML/TagSoup/Navigate/Types/TagTreePosState.hs
@@ -51,7 +51,7 @@
 import Control.Applicative(Applicative((<*>), pure), Alternative((<|>), empty), liftA2, (*>))
 import Control.Category((.))
 import Control.Lens(Rewrapped, Wrapped, Unwrapped, _Wrapped', _Wrapped, iso, view, preview, over, from, _head, _1, _2, _3)
-import Control.Monad(Monad(return, (>>=)), unless)
+import Control.Monad(Monad(return, (>>=)))
 import Control.Monad.Morph(MFunctor(hoist))
 import Control.Monad.Reader.Class(MonadReader(ask, local, reader))
 import Control.Monad.State.Class(MonadState(state, get, put), gets, modify)
@@ -361,44 +361,48 @@
   Monad f =>
   TagTreePosStateT str f a
   -> TagTreePosStateT str f b
-  -> (TagTree str -> f Bool)
-  -> TagTreePosStateT str f ()
+  -> (TagTree str -> f (Maybe x))
+  -> TagTreePosStateT str f x
 findTreeT s1 s2 pr =
   do  c <- liftTagTreePosState content
       z <- lift (pr c)
-      unless z ((s1 *> breadthFirstFindTreeT pr) <|> (s2 *> breadthFirstFindTreeT pr))
-
+      case z of
+        Nothing ->
+          (s1 *> breadthFirstFindTreeT pr) <|> (s2 *> breadthFirstFindTreeT pr)
+        Just x ->
+          pure x
+  
 findTree ::
-  TagTreePosState str ()
-  -> TagTreePosState str ()
-  -> (TagTree str -> Bool)
-  -> TagTreePosState str ()
+  TagTreePosState str a
+  -> TagTreePosState str b
+  -> (TagTree str -> Maybe x)
+  -> TagTreePosState str x
 findTree s1 s2 pr =
   findTreeT s1 s2 (Identity . pr)
 
 depthFirstFindTreeT ::
   Monad f =>
-  (TagTree str -> f Bool)
-  -> TagTreePosStateT str f ()
+  (TagTree str -> f (Maybe x))
+  -> TagTreePosStateT str f x
 depthFirstFindTreeT =
   findTreeT (liftTagTreePosState firstChild) (liftTagTreePosState nextSibling)
 
 depthFirstFindTree ::
-  (TagTree str -> Bool)
-  -> TagTreePosState str ()
+  (TagTree str -> Maybe x)
+  -> TagTreePosState str x
 depthFirstFindTree pr =
   depthFirstFindTreeT (Identity . pr)
 
 breadthFirstFindTreeT ::
   Monad f =>
-  (TagTree str -> f Bool)
-  -> TagTreePosStateT str f ()
+  (TagTree str -> f (Maybe x))
+  -> TagTreePosStateT str f x
 breadthFirstFindTreeT =
   findTreeT (liftTagTreePosState nextSibling) (liftTagTreePosState firstChild)
 
 breadthFirstFindTree ::
-  (TagTree str -> Bool)
-  -> TagTreePosState str ()
+  (TagTree str -> Maybe x)
+  -> TagTreePosState str x
 breadthFirstFindTree pr =
   breadthFirstFindTreeT (Identity . pr)
 
diff --git a/tagsoup-navigate.cabal b/tagsoup-navigate.cabal
--- a/tagsoup-navigate.cabal
+++ b/tagsoup-navigate.cabal
@@ -1,5 +1,5 @@
 name:                 tagsoup-navigate
-version:              0.1.0.4
+version:              0.1.0.5
 synopsis:             Tagsoup Navigate
 description:          Lenses and data types for navigating tagsoup
 license:              BSD3
