diff --git a/lex-applicative.cabal b/lex-applicative.cabal
--- a/lex-applicative.cabal
+++ b/lex-applicative.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.2
 name:                lex-applicative
-version:             0.0.0.0
+version:             0.0.0.1
 synopsis:            See README for more info
 description:         See README for more info
 homepage:            https://github.com/strake/lex-applicative.hs
@@ -52,7 +52,9 @@
   exposed-modules:     Data.TextPos
                      , Text.Lexer
                      , Text.Regex.Applicative.Lex
-  build-depends:       hs-functors ^>= 0.1.4
+  other-modules:       Util.Private
+  build-depends:       dlist ^>= 0.8.0.7
+                     , hs-functors ^>= 0.1.4
                      , parser-combinators ^>= 1.2
                      , regex-applicative ^>= 0.3.3
                      , text ^>= 1.2.3
diff --git a/src/Text/Lexer.hs b/src/Text/Lexer.hs
--- a/src/Text/Lexer.hs
+++ b/src/Text/Lexer.hs
@@ -8,7 +8,7 @@
 import qualified Data.Char as Char
 import           Data.Semigroup (Min (..), Max (..))
 import qualified Data.TextPos as Text
-import           Text.Regex.Applicative (RE, findLongestPrefix')
+import           Text.Regex.Applicative (RE, findLongestPrefix', reFoldl)
 import qualified Text.Regex.Applicative as RE
 import           Util
 
@@ -23,7 +23,7 @@
 defaultLexerSpec :: LexerSpec Text.Pos Char t
 defaultLexerSpec = LexerSpec
   { token = empty
-  , space = () <$ many (RE.psym Char.isSpace)
+  , space = () <$ RE.psym Char.isSpace
   , blockComment = empty
   , move = Text.move
   , init = Text.Pos 0 1 0
@@ -32,7 +32,7 @@
 lex :: LexerSpec p x t -> [x] -> Free ((,,) (Min p, Max p) t) (Maybe (Error p))
 lex LexerSpec {..} = go' [] . annotate move init
   where
-    go bs = stripLongestPrefix' stripAnnotation (many space) & go' bs
+    go bs = stripLongestPrefix' stripAnnotation (reFoldl RE.Greedy pure () space) & go' bs
     go' bs' xs@(AList p l) = case (bs', l) of
         ([], Nothing) -> Pure Nothing
         (_,  Nothing) -> Pure (Just (Error p))
@@ -62,4 +62,4 @@
   deriving (Eq, Ord, Read, Show)
 
 stripLongestPrefix' :: (xs -> Maybe (x, xs)) -> RE x a -> xs -> xs
-stripLongestPrefix' uncons re = flip maybe snd <*> findLongestPrefix' uncons re
+stripLongestPrefix' uncons re = flip maybe snd <*> findLongestPrefix' uncons (() <$ re)
diff --git a/src/Text/Regex/Applicative/Lex.hs b/src/Text/Regex/Applicative/Lex.hs
--- a/src/Text/Regex/Applicative/Lex.hs
+++ b/src/Text/Regex/Applicative/Lex.hs
@@ -5,15 +5,17 @@
 import           Control.Applicative.Combinators (between, count')
 import           Control.Monad ((>=>), guard, replicateM)
 import qualified Data.Char.Properties.DerivedCore as UC
+import qualified Data.DList as DList
 import           Data.Foldable
 import           Data.Text (Text)
 import qualified Data.Text as T
 import qualified Data.Text.Lazy as TL
 import qualified Data.Text.Normalize as T
 import           Numeric.Natural
-import           Text.Regex.Applicative hiding (string)
+import           Text.Regex.Applicative hiding (string, some, many)
 import qualified Text.Regex.Applicative as RE
 import           Util hiding (some)
+import           Util.Private
 
 natural' :: RE Char Natural
 natural' = asum
@@ -40,14 +42,12 @@
 ident' = ident defaultIdentSpec
 
 ident :: IdentSpec -> RE Char Text
-ident IdentSpec {..} = normalize . T.pack <$> start <:> many cont <++> (fmap asum . many) (med <:> some cont)
+ident IdentSpec {..} = normalize . T.pack . DList.toList <$>
+    start <:> many cont <++> (fmap asum . RE.many) (med <:> some cont)
   where
     start = psym isStart
     cont = psym isContinue
     med = psym isMedial
-    infixr 5 <:>, <++>
-    (<:>) = liftA2 (:)
-    (<++>) = liftA2 (++)
 
 data IdentSpec = IdentSpec
   { isStart, isContinue, isMedial :: Char -> Bool
@@ -70,7 +70,7 @@
         x       -> x
 
 string :: RE Char TL.Text
-string = TL.pack <$> between (sym '"') (sym '"') (many xre)
+string = TL.pack . DList.toList <$> between (sym '"') (sym '"') (many xre)
   where xre = psym (∉ "\"\\") <|> sym '\\' *> (psym (∈ "\"\\") <|> esc)
 
 esc :: RE Char Char
diff --git a/src/Util/Private.hs b/src/Util/Private.hs
new file mode 100644
--- /dev/null
+++ b/src/Util/Private.hs
@@ -0,0 +1,17 @@
+module Util.Private where
+
+import Control.Applicative hiding (some, many)
+import Text.Regex.Applicative hiding (some, many)
+import Util hiding (some)
+
+infixr 5 <:>, <++>
+(<:>) :: (Applicative p, Alternative q) => p a -> p (q a) -> p (q a)
+(<++>) :: (Applicative p, Alternative q) => p (q a) -> p (q a) -> p (q a)
+(<:>) = liftA2 (<|)
+(<++>) = liftA2 (<|>)
+
+many :: Alternative q => RE x a -> RE x (q a)
+many = reFoldl Greedy (|>) empty
+
+some :: Alternative q => RE x a -> RE x (q a)
+some a = a <:> many a
