@@ -24,6 +24,7 @@ import Control.Monad.IO.Class (MonadIO(liftIO))
2424import Data.Bits (Bits (.. ))
2525import Data.Word (Word8 )
2626import Data.Char (chr , ord , isSpace )
27+ import Data.Functor ((<&>) )
2728import Data.Function ((&) )
2829import Data.List (unfoldr , intersperse )
2930import Data.Maybe (fromMaybe )
@@ -78,6 +79,9 @@ data DetailedChar =
7879 , _combiningClass :: Int
7980 , _decompositionType :: Maybe DecompType
8081 , _decomposition :: Decomp
82+ , _simpleUppercaseMapping :: Maybe Char
83+ , _simpleLowercaseMapping :: Maybe Char
84+ , _simpleTitlecaseMapping :: Maybe Char
8185 }
8286 deriving (Show )
8387
@@ -99,6 +103,10 @@ apacheLicense modName =
99103readCodePoint :: String -> Char
100104readCodePoint = chr . read . (" 0x" ++ )
101105
106+ readCodePointM :: String -> Maybe Char
107+ readCodePointM " " = Nothing
108+ readCodePointM u = Just (readCodePoint u)
109+
102110genSignature :: String -> String
103111genSignature = (<> " :: Char -> Bool" )
104112
@@ -390,8 +398,8 @@ genDecomposeDefModule moduleName before after dtype pred =
390398 step st dc = genDecomposeDef dc : st
391399
392400 done st =
393- let body = genHeader ++ before ++ genSign ++ reverse st ++ after
394- in unlines body
401+ let body = mconcat [ genHeader, before, genSign, reverse st, after]
402+ in unlines body
395403
396404 genDecomposeDef dc =
397405 " decompose "
@@ -488,6 +496,48 @@ genCompositionsModule moduleName compExclu non0CC =
488496 ++ composeStarterPair (reverse sp)
489497 ++ isSecondStarter (Set. toList (Set. fromList ss))
490498
499+ genSimpleCaseMappingModule
500+ :: Monad m
501+ => String
502+ -> String
503+ -> (DetailedChar -> Maybe Char )
504+ -> Fold m DetailedChar String
505+ genSimpleCaseMappingModule moduleName funcName field =
506+ done <$> Fold. foldl' step initial
507+
508+ where
509+
510+ genHeader =
511+ [ apacheLicense moduleName
512+ , " module " <> moduleName
513+ , " (" ++ funcName ++ " )"
514+ , " where"
515+ , " "
516+ ]
517+ genSign =
518+ [ " {-# NOINLINE " ++ funcName ++ " #-}"
519+ , funcName ++ " :: Char -> Char"
520+ ]
521+ initial = []
522+
523+ step ds dc = case genUpper dc of
524+ Nothing -> ds
525+ Just d -> d : ds
526+
527+ after = [funcName ++ " c = c" ]
528+
529+ done st =
530+ let body = mconcat [genHeader, genSign, reverse st, after]
531+ in unlines body
532+
533+ genUpper dc = field dc <&> \ c -> mconcat
534+ [ funcName
535+ , " "
536+ , show (_char dc)
537+ , " = "
538+ , show c
539+ ]
540+
491541genCorePropertiesModule ::
492542 Monad m => String -> (String -> Bool ) -> Fold m (String , [Int ]) String
493543genCorePropertiesModule moduleName isProp =
@@ -621,7 +671,16 @@ parseUnicodeDataLines
621671parseDetailedChar :: String -> DetailedChar
622672parseDetailedChar line =
623673 DetailedChar
624- (readCodePoint char) name (read gc) (read combining) dctype dcval
674+ { _char = readCodePoint char
675+ , _name = name
676+ , _generalCategory = read gc
677+ , _combiningClass = read combining
678+ , _decompositionType = dctype
679+ , _decomposition = dcval
680+ , _simpleUppercaseMapping = readCodePointM sUpper
681+ , _simpleLowercaseMapping = readCodePointM sLower
682+ , _simpleTitlecaseMapping = readCodePointM sTitle
683+ }
625684
626685 where
627686
@@ -632,13 +691,15 @@ parseDetailedChar line =
632691 (_bidi, line5) = span (/= ' ;' ) (tail line4)
633692 (decomposition, line6) = span (/= ' ;' ) (tail line5)
634693 (dctype, dcval) = readDecomp decomposition
635- (_numeric, line7) = span (/= ' ;' ) (tail line6)
636- (_bidiM, line8) = span (/= ' ;' ) (tail line7)
637- (_uni1Name, line9) = span (/= ' ;' ) (tail line8)
638- (_iso, line10) = span (/= ' ;' ) (tail line9)
639- (_sUpper, line11) = span (/= ' ;' ) (tail line10)
640- (_sLower, line12) = span (/= ' ;' ) (tail line11)
641- _sTitle = tail line12
694+ (_decimal, line7) = span (/= ' ;' ) (tail line6)
695+ (_digit, line8) = span (/= ' ;' ) (tail line7)
696+ (_numeric, line9) = span (/= ' ;' ) (tail line8)
697+ (_bidiM, line10) = span (/= ' ;' ) (tail line9)
698+ (_uni1Name, line11) = span (/= ' ;' ) (tail line10)
699+ (_iso, line12) = span (/= ' ;' ) (tail line11)
700+ (sUpper, line13) = span (/= ' ;' ) (tail line12)
701+ (sLower, line14) = span (/= ' ;' ) (tail line13)
702+ sTitle = tail line14
642703
643704-------------------------------------------------------------------------------
644705-- Generation
@@ -738,6 +799,9 @@ genModules indir outdir props = do
738799 , decompositionsK2
739800 , decompositionsK
740801 , generalCategory
802+ , simpleUpperCaseMapping
803+ , simpleLowerCaseMapping
804+ , simpleTitleCaseMapping
741805 ]
742806
743807 runGenerator
@@ -797,3 +861,15 @@ genModules indir outdir props = do
797861 generalCategory =
798862 ( " Unicode.Internal.Char.UnicodeData.GeneralCategory"
799863 , genGeneralCategoryModule)
864+
865+ simpleUpperCaseMapping =
866+ ( " Unicode.Internal.Char.UnicodeData.SimpleUpperCaseMapping"
867+ , \ m -> genSimpleCaseMappingModule m " toSimpleUpperCase" _simpleUppercaseMapping)
868+
869+ simpleLowerCaseMapping =
870+ ( " Unicode.Internal.Char.UnicodeData.SimpleLowerCaseMapping"
871+ , \ m -> genSimpleCaseMappingModule m " toSimpleLowerCase" _simpleLowercaseMapping)
872+
873+ simpleTitleCaseMapping =
874+ ( " Unicode.Internal.Char.UnicodeData.SimpleTitleCaseMapping"
875+ , \ m -> genSimpleCaseMappingModule m " toSimpleTitleCase" _simpleTitlecaseMapping)
0 commit comments