module Text.Newline (
Newline (CR, LF, CRLF)
, AsNewline(_Newline, _CR, _LF, _CRLF)
, newlineToString
, parseNewline
) where
import Control.DeepSeq (NFData (rnf))
import Control.Lens (Prism', prism, prism')
import Data.String (IsString (fromString))
import Data.Text (Text)
data Newline =
CR
| LF
| CRLF
deriving (Eq, Ord, Show)
instance NFData Newline where
rnf x = seq x ()
class AsNewline r where
_Newline :: Prism' r Newline
_CR :: Prism' r ()
_LF :: Prism' r ()
_CRLF :: Prism' r ()
_CR = _Newline . _CR
_LF = _Newline . _LF
_CRLF = _Newline . _CRLF
instance AsNewline Newline where
_Newline = id
_CR =
prism (const CR) $ \x -> case x of
CR -> Right ()
_ -> Left x
_LF =
prism (const LF) $ \x -> case x of
LF -> Right ()
_ -> Left x
_CRLF =
prism (const CRLF) $ \x -> case x of
CRLF -> Right ()
_ -> Left x
instance AsNewline Text where
_Newline = prism' newlineToString parseNewline
newlineToString :: IsString s => Newline -> s
newlineToString n = fromString $
case n of
CR -> "\r"
LF -> "\n"
CRLF -> "\r\n"
parseNewline :: Text -> Maybe Newline
parseNewline "" = Nothing
parseNewline "\r" = Just CR
parseNewline "\n" = Just LF
parseNewline "\r\n" = Just CRLF
parseNewline _ = Nothing