module HsDev.Tools.Refact (
Refact(..), refactMessage, refactAction,
refact, update,
replace, cut, paste,
fromRegion, fromPosition
) where
import Control.Lens hiding ((.=))
import Data.Aeson
import Data.Text (Text)
import Data.Text.Region hiding (Region(..), update)
import qualified Data.Text.Region as R
import HsDev.Symbols.Location
import HsDev.Util
data Refact = Refact {
_refactMessage :: Text,
_refactAction :: Replace Text }
deriving (Eq, Show)
instance ToJSON Refact where
toJSON (Refact msg cor) = object [
"message" .= msg,
"action" .= cor]
instance FromJSON Refact where
parseJSON = withObject "correction" $ \v -> Refact <$>
v .:: "message" <*>
v .:: "action"
makeLenses ''Refact
instance Regioned Refact where
regions = refactAction . regions
refact :: [Refact] -> Text -> Text
refact rs = apply act where
act = Edit (rs ^.. each . refactAction)
update :: Regioned a => [Refact] -> [a] -> [a]
update rs = map (R.update act) where
act = Edit (rs ^.. each . refactAction)
fromRegion :: Region -> R.Region
fromRegion (Region f t) = fromPosition f `till` fromPosition t
fromPosition :: Position -> Point
fromPosition (Position l c) = pt (pred l) (pred c)