type toks
This commit is contained in:
		
							parent
							
								
									9dfe7b924d
								
							
						
					
					
						commit
						40dfb86e72
					
				
							
								
								
									
										14
									
								
								Toks.hs
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								Toks.hs
									
									
									
									
									
								
							|  | @ -4,28 +4,36 @@ import Data.Char | ||||||
| import Data.Function | import Data.Function | ||||||
| import Data.List | import Data.List | ||||||
| 
 | 
 | ||||||
|  | type Tok = String | ||||||
|  | 
 | ||||||
|  | escape :: Char -> String | ||||||
| escape '\\' = "\\\\" | escape '\\' = "\\\\" | ||||||
| escape '\n' = "\\n" | escape '\n' = "\\n" | ||||||
| escape x = pure x | escape x = pure x | ||||||
| 
 | 
 | ||||||
|  | unescape :: String -> String | ||||||
| unescape [] = [] | unescape [] = [] | ||||||
| unescape ('\\':'\\':xs) = '\\' : unescape xs | unescape ('\\':'\\':xs) = '\\' : unescape xs | ||||||
| unescape ('\\':'n':xs) = '\n' : unescape xs | unescape ('\\':'n':xs) = '\n' : unescape xs | ||||||
| unescape ('\\':_) = error "bad escape?" | unescape ('\\':_) = error "bad escape?" | ||||||
| unescape (x:xs) = x : unescape xs | unescape (x:xs) = x : unescape xs | ||||||
| 
 | 
 | ||||||
|  | markSpace :: String -> Tok | ||||||
| markSpace [] = error "wat" | markSpace [] = error "wat" | ||||||
| markSpace s@(c:_) | markSpace s@(c:_) | ||||||
|   | isSpace c = '.' : s |   | isSpace c = '.' : s | ||||||
|   | otherwise = '|' : s |   | otherwise = '|' : s | ||||||
| 
 | 
 | ||||||
|  | unmarkSpace :: Tok -> String | ||||||
| unmarkSpace ('.':s) = s | unmarkSpace ('.':s) = s | ||||||
| unmarkSpace ('|':s) = s | unmarkSpace ('|':s) = s | ||||||
| unmarkSpace x = error "unwat" | unmarkSpace x = error "unwat" | ||||||
| 
 | 
 | ||||||
|  | space :: Tok -> Bool | ||||||
| space ('.':_) = True | space ('.':_) = True | ||||||
| space _ = False | space _ = False | ||||||
| 
 | 
 | ||||||
|  | joinSpaces :: [Tok] -> [Tok] | ||||||
| joinSpaces [] = [] | joinSpaces [] = [] | ||||||
| joinSpaces (a@('.':as):xs) = | joinSpaces (a@('.':as):xs) = | ||||||
|   case joinSpaces xs of |   case joinSpaces xs of | ||||||
|  | @ -33,21 +41,27 @@ joinSpaces (a@('.':as):xs) = | ||||||
|     xs' -> a : xs' |     xs' -> a : xs' | ||||||
| joinSpaces (x:xs) = x : joinSpaces xs | joinSpaces (x:xs) = x : joinSpaces xs | ||||||
| 
 | 
 | ||||||
|  | splitCategory :: String -> [Tok] | ||||||
| splitCategory = make . groupBy ((==) `on` generalCategory) | splitCategory = make . groupBy ((==) `on` generalCategory) | ||||||
| 
 | 
 | ||||||
|  | simpleCategory :: Char -> Int | ||||||
| simpleCategory c | simpleCategory c | ||||||
|   | isSpace c = 0 |   | isSpace c = 0 | ||||||
|   | isAlpha c = 1 |   | isAlpha c = 1 | ||||||
|   | isNumber c = 2 |   | isNumber c = 2 | ||||||
|   | otherwise = 3 |   | otherwise = 3 | ||||||
| 
 | 
 | ||||||
|  | splitSimple :: String -> [Tok] | ||||||
| splitSimple = make . groupBy ((==) `on` simpleCategory) | splitSimple = make . groupBy ((==) `on` simpleCategory) | ||||||
| 
 | 
 | ||||||
|  | make :: [String] -> [Tok] | ||||||
| make = map (concatMap escape . markSpace) | make = map (concatMap escape . markSpace) | ||||||
| 
 | 
 | ||||||
| glue :: [String] -> String | glue :: [String] -> String | ||||||
| glue = concatMap (unmarkSpace . unescape) | glue = concatMap (unmarkSpace . unescape) | ||||||
| 
 | 
 | ||||||
|  | fromFile :: String -> [Tok] | ||||||
| fromFile = lines | fromFile = lines | ||||||
| 
 | 
 | ||||||
|  | toFile :: [Tok] -> String | ||||||
| toFile = unlines | toFile = unlines | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Mirek Kratochvil
						Mirek Kratochvil