From 466698a9de82046d04c5d85a2a6d32b6419e59dc Mon Sep 17 00:00:00 2001
From: Jonathan Apodaca <jrapodaca@gmail.com>
Date: Sun, 13 Apr 2025 21:49:48 -0600
Subject: [PATCH] more cleanup

---
 examples/surround.lua | 22 ++++++----------------
 lua/u/buffer.lua      |  7 ++-----
 lua/u/codewriter.lua  |  3 ++-
 3 files changed, 10 insertions(+), 22 deletions(-)

diff --git a/examples/surround.lua b/examples/surround.lua
index 533289f..358c9d0 100644
--- a/examples/surround.lua
+++ b/examples/surround.lua
@@ -170,29 +170,19 @@ function M.setup()
         local irange = Range.from_motion('i' .. from_c, { user_defined = true })
         if arange == nil or irange == nil then return end
 
-        local lrange = Range.new(arange.start, irange.start:must_next(-1))
-        local rrange = Range.new(irange.stop:must_next(1), arange.stop)
+        local lrange, rrange = arange:difference(irange)
+        if not lrange or not rrange then return end
 
         rrange:replace(to.right)
         lrange:replace(to.left)
       else
         -- replace `from.right` with `to.right`:
-        local last_line = arange:line(-1):text()
-        local from_right_match = last_line:match(vim.pesc(from.right) .. '$')
-        if from_right_match then
-          local match_start = arange.stop:clone()
-          match_start.col = match_start.col - #from_right_match + 1
-          Range.new(match_start, arange.stop):replace(to.right)
-        end
+        local right_text = arange:sub(-1, -#from.right)
+        right_text:replace(to.right)
 
         -- replace `from.left` with `to.left`:
-        local first_line = arange:line(1):text()
-        local from_left_match = first_line:match('^' .. vim.pesc(from.left))
-        if from_left_match then
-          local match_end = arange.start:clone()
-          match_end.col = match_end.col + #from_left_match - 1
-          Range.new(arange.start, match_end):replace(to.left)
-        end
+        local left_text = arange:sub(1, #from.left)
+        left_text:replace(to.left)
       end
     end)
   end, { noremap = true, silent = true })
diff --git a/lua/u/buffer.lua b/lua/u/buffer.lua
index 4e83d7e..0b9d806 100644
--- a/lua/u/buffer.lua
+++ b/lua/u/buffer.lua
@@ -5,17 +5,14 @@ local Renderer = require('u.renderer').Renderer
 --- @field bufnr number
 --- @field private renderer u.Renderer
 local Buffer = {}
+Buffer.__index = Buffer
 
 --- @param bufnr? number
 --- @return u.Buffer
 function Buffer.from_nr(bufnr)
   if bufnr == nil or bufnr == 0 then bufnr = vim.api.nvim_get_current_buf() end
-
   local renderer = Renderer.new(bufnr)
-  return setmetatable({
-    bufnr = bufnr,
-    renderer = renderer,
-  }, { __index = Buffer })
+  return setmetatable({ bufnr = bufnr, renderer = renderer }, Buffer)
 end
 
 --- @return u.Buffer
diff --git a/lua/u/codewriter.lua b/lua/u/codewriter.lua
index 3f47136..ab854fd 100644
--- a/lua/u/codewriter.lua
+++ b/lua/u/codewriter.lua
@@ -5,6 +5,7 @@ local Buffer = require 'u.buffer'
 --- @field indent_level number
 --- @field indent_str string
 local CodeWriter = {}
+CodeWriter.__index = CodeWriter
 
 --- @param indent_level? number
 --- @param indent_str? string
@@ -18,7 +19,7 @@ function CodeWriter.new(indent_level, indent_str)
     indent_level = indent_level,
     indent_str = indent_str,
   }
-  setmetatable(cw, { __index = CodeWriter })
+  setmetatable(cw, CodeWriter)
   return cw
 end