diff --git a/html-entity.cabal b/html-entity.cabal
--- a/html-entity.cabal
+++ b/html-entity.cabal
@@ -1,5 +1,5 @@
 name:               html-entity
-version:            0.1.0.0
+version:            0.1.1.0
 synopsis:           HTML entity decoding and encoding for Text
 description:        Fast, attoparsec-powered HTML entity decoding and encoding for Text
 license:            BSD3
@@ -38,7 +38,7 @@
   hs-source-dirs:     src
   build-depends:      base                 == 4.*
                     , attoparsec
-                    , base-compat          == 0.10.*
+                    , base-compat          >= 0.9
                     , text
                     , unordered-containers
   default-language:   Haskell2010
diff --git a/src/Text/HTMLEntity.hs b/src/Text/HTMLEntity.hs
--- a/src/Text/HTMLEntity.hs
+++ b/src/Text/HTMLEntity.hs
@@ -1,9 +1,17 @@
 -- | Efficient decoding and encoding of HTML entities in text.
-module Text.HTMLEntity where
+module Text.HTMLEntity
+    ( -- * Usage
+      decode
+    , decode'
+    , encode
+    -- ** Partial decoding/encoding
+    -- $partial
+    , decodePartial
+    , encodePartial
+    ) where
 
 import Data.Attoparsec.Text
 import Data.Text (Text)
-import qualified Data.Text as T
 import Prelude.Compat
 import Text.HTMLEntity.Parser
 
@@ -11,6 +19,7 @@
 -- >>> :set -XOverloadedStrings
 -- >>> import qualified Data.Text.IO as T
 
+-- *** Decoding/encoding
 -- | Decode HTML entities contained in the given text. Returns
 -- @Left decodeError@ on failure. The parser will do its best to explain
 -- the problem.
@@ -27,9 +36,7 @@
 -- >>> decode "&#xffffffff;"
 -- Left "entity: Failed reading: 4294967295 is out of Char range"
 decode :: Text -> Either String Text
-decode t
-    | T.null t = Right t
-decode x = parseOnly decodeParser x
+decode = parseOnly decodeParser
 {-# INLINE decode #-}
 
 -- | Like 'decode', except that if a decode error occurs, the original
@@ -62,3 +69,18 @@
 encode :: Text -> Text
 encode = either (error "html-entity internal encoding error") id . parseOnly encodeParser
 {-# INLINE encode #-}
+
+{- $partial
+These functions are provided for convenience if you're using attoparsec
+in a streaming style, and all return 'Result' values. Use them as you
+would normally.
+-}
+-- | Partial 'decode'.
+decodePartial :: Text -> Result Text
+decodePartial = parse decodeParser
+{-# INLINE decodePartial #-}
+
+-- | Partial 'encode'.
+encodePartial :: Text -> Result Text
+encodePartial = parse encodeParser
+{-# INLINE encodePartial #-}
diff --git a/src/Text/HTMLEntity/Parser.hs b/src/Text/HTMLEntity/Parser.hs
--- a/src/Text/HTMLEntity/Parser.hs
+++ b/src/Text/HTMLEntity/Parser.hs
@@ -10,16 +10,15 @@
 import Data.Ix
 import Data.Monoid.Compat
 import qualified Data.Text as T
-import qualified Text.HTMLEntity.Table as Table
 import Prelude.Compat
+import qualified Text.HTMLEntity.Table as Table
 
 decodeParser :: Parser T.Text
-decodeParser =
-    liftA2
-        (<>)
-        ((A.takeWhile1 (/= '&') <?> "plain text") <|> (ent <?> "entity"))
-        (eof <|> decodeParser)
+decodeParser = go
   where
+    go =
+        eof <|>
+        liftA2 (<>) ((A.takeWhile1 (/= '&') <?> "plain text") <|> (ent <?> "entity")) go
     eof = "" <$ endOfInput
     ent = do
         void $ char '&'
