-- | This module helps parsing some text with delimited differences
module Data.Text.Token where

import Protolude
import Data.Text qualified as T

-- | A Token is used to enclose a piece of text to compare and delimiters showing where the text is different from another piece of text
--   Start / End are markers for the beginning and end of that text
data Token
  = Kept Text
  | Delimiter Text
  | Start
  | End
  deriving (Token -> Token -> Bool
(Token -> Token -> Bool) -> (Token -> Token -> Bool) -> Eq Token
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Token -> Token -> Bool
$c/= :: Token -> Token -> Bool
== :: Token -> Token -> Bool
$c== :: Token -> Token -> Bool
Eq, Int -> Token -> ShowS
[Token] -> ShowS
Token -> String
(Int -> Token -> ShowS)
-> (Token -> String) -> ([Token] -> ShowS) -> Show Token
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Token] -> ShowS
$cshowList :: [Token] -> ShowS
show :: Token -> String
$cshow :: Token -> String
showsPrec :: Int -> Token -> ShowS
$cshowsPrec :: Int -> Token -> ShowS
Show)

-- | Show a Token by skipping Start/End if present
showToken :: Token -> Text
showToken :: Token -> Text
showToken (Kept Text
t) = Text
t
showToken (Delimiter Text
t) = Text
t
showToken Token
Start = Text
""
showToken Token
End = Text
""

-- | Show a list of tokens. Start/End are skipped
showTokens :: [Token] -> Text
showTokens :: [Token] -> Text
showTokens = [Text] -> Text
T.concat ([Text] -> Text) -> ([Token] -> [Text]) -> [Token] -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Token -> Text) -> [Token] -> [Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Token -> Text
showToken