packages feed

gvti-0.2.0.0: Formatting.hs

{-# OPtIONS_HADDOCK show-extensions #-}
{-# LANGUAGE BangPatterns #-}

{-|
Module      : Formatting
Description : GraphViz Tabular Interface formatting functionality to be used with the @gvti -g@.
Copyright   : (c) OleksandrZhabenko, 2017-2022
License     : MIT
Maintainer  : olexandr543@yahoo.com
Stability   : Experimental

-}

module Formatting where

import Data.List
import Text.Read (readMaybe)
import Data.Maybe (fromMaybe)
import Data.Char (isDigit)

formatBStr :: Int -> Char -> String -> String
formatBStr n x xs 
  | n > 0 = (iterate (x:) xs) !! n
  | otherwise = xs

formatEStr :: Int -> Char -> String -> String
formatEStr m x xs 
  | m > 0 = xs `mappend` replicate m x
  | otherwise = xs

formatBothStr :: Int -> Int -> Char -> String -> String
formatBothStr m n x = formatBStr m x . formatEStr n x
{-# INLINE formatBothStr  #-}

formatLines :: Char -> [String] -> [String]
formatLines x xss = map (\(xs,n,m) -> formatBothStr n m x $ xs) . zip3 ws j2s $ ms
  where (!js,!rs) = unzip . map (span isDigit) $ xss
        ws = map (dropWhile (== ',')) rs
        ll1s = map (length . filter (== x)) $ xss
        !j2s = map (\wws -> fromMaybe 0 (readMaybe wws::Maybe Int)) js
        lls = zipWith (+) ll1s j2s
        !mx = maximum lls
        !ms = zipWith (\x k -> mx - x - k) ll1s j2s
{-# INLINE formatLines #-}