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.List | ||||
| 
 | ||||
| type Tok = String | ||||
| 
 | ||||
| escape :: Char -> String | ||||
| escape '\\' = "\\\\" | ||||
| escape '\n' = "\\n" | ||||
| escape x = pure x | ||||
| 
 | ||||
| unescape :: String -> String | ||||
| unescape [] = [] | ||||
| unescape ('\\':'\\':xs) = '\\' : unescape xs | ||||
| unescape ('\\':'n':xs) = '\n' : unescape xs | ||||
| unescape ('\\':_) = error "bad escape?" | ||||
| unescape (x:xs) = x : unescape xs | ||||
| 
 | ||||
| markSpace :: String -> Tok | ||||
| markSpace [] = error "wat" | ||||
| markSpace s@(c:_) | ||||
|   | isSpace c = '.' : s | ||||
|   | otherwise = '|' : s | ||||
| 
 | ||||
| unmarkSpace :: Tok -> String | ||||
| unmarkSpace ('.':s) = s | ||||
| unmarkSpace ('|':s) = s | ||||
| unmarkSpace x = error "unwat" | ||||
| 
 | ||||
| space :: Tok -> Bool | ||||
| space ('.':_) = True | ||||
| space _ = False | ||||
| 
 | ||||
| joinSpaces :: [Tok] -> [Tok] | ||||
| joinSpaces [] = [] | ||||
| joinSpaces (a@('.':as):xs) = | ||||
|   case joinSpaces xs of | ||||
|  | @ -33,21 +41,27 @@ joinSpaces (a@('.':as):xs) = | |||
|     xs' -> a : xs' | ||||
| joinSpaces (x:xs) = x : joinSpaces xs | ||||
| 
 | ||||
| splitCategory :: String -> [Tok] | ||||
| splitCategory = make . groupBy ((==) `on` generalCategory) | ||||
| 
 | ||||
| simpleCategory :: Char -> Int | ||||
| simpleCategory c | ||||
|   | isSpace c = 0 | ||||
|   | isAlpha c = 1 | ||||
|   | isNumber c = 2 | ||||
|   | otherwise = 3 | ||||
| 
 | ||||
| splitSimple :: String -> [Tok] | ||||
| splitSimple = make . groupBy ((==) `on` simpleCategory) | ||||
| 
 | ||||
| make :: [String] -> [Tok] | ||||
| make = map (concatMap escape . markSpace) | ||||
| 
 | ||||
| glue :: [String] -> String | ||||
| glue = concatMap (unmarkSpace . unescape) | ||||
| 
 | ||||
| fromFile :: String -> [Tok] | ||||
| fromFile = lines | ||||
| 
 | ||||
| toFile :: [Tok] -> String | ||||
| toFile = unlines | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Mirek Kratochvil
						Mirek Kratochvil