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