32 lines
1.1 KiB
Haskell
32 lines
1.1 KiB
Haskell
module UToy.Names (allNames, blockName, searchCaseInsensitive) where
|
|
|
|
import Data.Char (ord)
|
|
import Data.Maybe (maybeToList)
|
|
import Data.Text (Text)
|
|
import Data.Vector (Vector)
|
|
|
|
import qualified Data.Text as Text
|
|
import qualified Data.Vector as Vector
|
|
import qualified Unicode.Char.General.Blocks as UnicodeBlocks
|
|
import qualified Unicode.Char.General.Names as UnicodeNames
|
|
|
|
-- | Retrieve name and aliases (suffixed with @*@) of a 'Char'.
|
|
allNames :: Char -> [Text]
|
|
allNames c = map Text.pack $
|
|
maybeToList (UnicodeNames.name c)
|
|
++ map (++ "*") (UnicodeNames.nameAliases c)
|
|
|
|
blockName :: Char -> Maybe Text
|
|
blockName c = Text.pack . UnicodeBlocks.blockName . UnicodeBlocks.blockDefinition <$> UnicodeBlocks.block c
|
|
|
|
searchCaseInsensitive :: Text -> [Char]
|
|
searchCaseInsensitive search = filter go [minBound..maxBound]
|
|
where
|
|
go c = any matches $ Vector.unsafeIndex lowerNames (ord c - ord minBound)
|
|
matches t = Text.toLower search `Text.isInfixOf` t
|
|
|
|
lowerNames :: Vector [Text]
|
|
lowerNames = Vector.fromList $ map go [minBound..maxBound]
|
|
where
|
|
go = map Text.toLower . allNames
|