-- | Data type describing the operation of editing some text
module Data.Text.EditOperation where

import Protolude

-- | Atomic operation required to edit a piece of text
--   at a given position in the EditMatrix
data EditOperation a
  = Insert a
  | Delete a
  | Substitute a a
  | Keep a
  deriving (EditOperation a -> EditOperation a -> Bool
(EditOperation a -> EditOperation a -> Bool)
-> (EditOperation a -> EditOperation a -> Bool)
-> Eq (EditOperation a)
forall a. Eq a => EditOperation a -> EditOperation a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: EditOperation a -> EditOperation a -> Bool
$c/= :: forall a. Eq a => EditOperation a -> EditOperation a -> Bool
== :: EditOperation a -> EditOperation a -> Bool
$c== :: forall a. Eq a => EditOperation a -> EditOperation a -> Bool
Eq, Int -> EditOperation a -> ShowS
[EditOperation a] -> ShowS
EditOperation a -> String
(Int -> EditOperation a -> ShowS)
-> (EditOperation a -> String)
-> ([EditOperation a] -> ShowS)
-> Show (EditOperation a)
forall a. Show a => Int -> EditOperation a -> ShowS
forall a. Show a => [EditOperation a] -> ShowS
forall a. Show a => EditOperation a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [EditOperation a] -> ShowS
$cshowList :: forall a. Show a => [EditOperation a] -> ShowS
show :: EditOperation a -> String
$cshow :: forall a. Show a => EditOperation a -> String
showsPrec :: Int -> EditOperation a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> EditOperation a -> ShowS
Show)

-- | Inverse of an edit operation. It is used
--   to display not only how to go from text1 to text2 but also from text2 to text1
inverse :: EditOperation a -> EditOperation a
inverse :: forall a. EditOperation a -> EditOperation a
inverse (Insert a
a) = a -> EditOperation a
forall a. a -> EditOperation a
Delete a
a
inverse (Delete a
a) = a -> EditOperation a
forall a. a -> EditOperation a
Insert a
a
inverse (Substitute a
a1 a
a2) = a -> a -> EditOperation a
forall a. a -> a -> EditOperation a
Substitute a
a2 a
a1
inverse (Keep a
a) = a -> EditOperation a
forall a. a -> EditOperation a
Keep a
a