rectangular string utilities
This commit is contained in:
		
							parent
							
								
									a7384a9183
								
							
						
					
					
						commit
						71667f654a
					
				| @ -40,6 +40,8 @@ import Text.ParserCombinators.Parsec (parse) | ||||
| import Ledger.Dates | ||||
| 
 | ||||
| 
 | ||||
| -- strings | ||||
| 
 | ||||
| elideLeft width s = | ||||
|     case length s > width of | ||||
|       True -> ".." ++ (reverse $ take (width - 2) $ reverse s) | ||||
| @ -50,6 +52,65 @@ elideRight width s = | ||||
|       True -> take (width - 2) s ++ ".." | ||||
|       False -> s | ||||
| 
 | ||||
| -- | Join multi-line strings as side-by-side rectangular strings of the same height, top-padded. | ||||
| concatTopPadded :: [String] -> String | ||||
| concatTopPadded strs = intercalate "\n" $ map concat $ transpose padded | ||||
|     where | ||||
|       lss = map lines strs | ||||
|       h = maximum $ map length lss | ||||
|       ypad ls = replicate (difforzero h (length ls)) "" ++ ls | ||||
|       xpad ls = map (padleft w) ls where w | null ls = 0 | ||||
|                                            | otherwise = maximum $ map length ls | ||||
|       padded = map (xpad . ypad) lss | ||||
| 
 | ||||
| -- | Join multi-line strings as side-by-side rectangular strings of the same height, bottom-padded. | ||||
| concatBottomPadded :: [String] -> String | ||||
| concatBottomPadded strs = intercalate "\n" $ map concat $ transpose padded | ||||
|     where | ||||
|       lss = map lines strs | ||||
|       h = maximum $ map length lss | ||||
|       ypad ls = ls ++ replicate (difforzero h (length ls)) "" | ||||
|       xpad ls = map (padleft w) ls where w | null ls = 0 | ||||
|                                            | otherwise = maximum $ map length ls | ||||
|       padded = map (xpad . ypad) lss | ||||
| 
 | ||||
| -- | Convert a multi-line string to a rectangular string top-padded to the specified height. | ||||
| padtop :: Int -> String -> String | ||||
| padtop h s = intercalate "\n" xpadded | ||||
|     where | ||||
|       ls = lines s | ||||
|       sh = length ls | ||||
|       sw | null ls = 0 | ||||
|          | otherwise = maximum $ map length ls | ||||
|       ypadded = replicate (difforzero h sh) "" ++ ls | ||||
|       xpadded = map (padleft sw) ypadded | ||||
| 
 | ||||
| -- | Convert a multi-line string to a rectangular string bottom-padded to the specified height. | ||||
| padbottom :: Int -> String -> String | ||||
| padbottom h s = intercalate "\n" xpadded | ||||
|     where | ||||
|       ls = lines s | ||||
|       sh = length ls | ||||
|       sw | null ls = 0 | ||||
|          | otherwise = maximum $ map length ls | ||||
|       ypadded = ls ++ replicate (difforzero h sh) "" | ||||
|       xpadded = map (padleft sw) ypadded | ||||
| 
 | ||||
| -- | Convert a multi-line string to a rectangular string left-padded to the specified width. | ||||
| padleft :: Int -> String -> String | ||||
| padleft w "" = concat $ replicate w " " | ||||
| padleft w s = intercalate "\n" $ map (printf (printf "%%%ds" w)) $ lines s | ||||
| 
 | ||||
| -- | Convert a multi-line string to a rectangular string right-padded to the specified width. | ||||
| padright :: Int -> String -> String | ||||
| padright w "" = concat $ replicate w " " | ||||
| padright w s = intercalate "\n" $ map (printf (printf "%%-%ds" w)) $ lines s | ||||
| 
 | ||||
| -- math | ||||
| 
 | ||||
| difforzero :: (Num a, Ord a) => a -> a -> a | ||||
| difforzero a b = maximum [(a - b), 0] | ||||
| 
 | ||||
| -- regexps | ||||
| 
 | ||||
| instance Show Regex where show r = "a Regex" | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user