module Data.Text.ICU.Normalized.NFC (
NFCText,
packed,
builder,
text,
normalized
) where
import qualified Data.Text.ICU.Normalize as ICU
import Data.Text (Text)
import qualified Data.Text.Lazy as LT
import GHC.Generics (Generic)
import Data.Text.Encoding (encodeUtf8, decodeUtf8)
import qualified Data.ByteString.Char8 as C8
import Data.String (IsString(..))
import Text.ParserCombinators.ReadP
import Text.Read hiding (get)
import Prelude.Unicode
import Data.Data
import Data.Typeable
import Control.Lens hiding (strict, lazy)
import Data.ByteString (ByteString)
import qualified Data.Text.Strict.Lens as DL
import Data.Text.Lens (IsText(..))
newtype NFCText = NFCText {unNFC ∷ Text} deriving (Show, Generic, Data, Typeable)
normalized ∷ Iso' NFCText Text
normalized = iso (unNFC) (nnfc)
instance IsText NFCText where
packed = iso (nnfc ∘ view DL.packed) (review DL.packed ∘ unNFC)
builder = iso (view DL.builder ∘ unNFC) (nnfc ∘ review DL.builder)
nnfc t =
let
nt = ICU.normalize ICU.NFC
isn = if ICU.isNormalized ICU.NFC t then t else nt t
quick t = ICU.quickCheck ICU.NFC t >>=
\q → if q then return t
else return $ nt t
in
NFCText $ case quick t of
Nothing → isn
Just q → q
instance Ord NFCText where
(NFCText a) `compare` (NFCText b) =
let
cmp = ICU.compare [ICU.InputIsFCD]
in
a `cmp` b
instance Eq NFCText where
a == b = a `compare` b == EQ