From 40dfb86e7246a40d01fb518578401702ec9f135c Mon Sep 17 00:00:00 2001 From: Mirek Kratochvil Date: Tue, 15 Jul 2025 15:40:36 +0200 Subject: [PATCH] type toks --- Toks.hs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Toks.hs b/Toks.hs index 29fa381..bff68e6 100644 --- a/Toks.hs +++ b/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