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

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

-}

{-# LANGUAGE NoImplicitPrelude #-}

module Formatting where

import GHC.Base
import GHC.List
import GHC.Num ((+), (-))
import Text.Read (readMaybe)
import Data.Maybe (fromMaybe)
import Data.Char (isDigit)

formatBStr :: Int -> Char -> String -> String
formatBStr :: Int -> Char -> String -> String
formatBStr Int
n Char
x String
xs 
  | Int
n forall a. Ord a => a -> a -> Bool
> Int
0 = (forall a. (a -> a) -> a -> [a]
iterate (Char
xforall a. a -> [a] -> [a]
:) String
xs) forall a. [a] -> Int -> a
!! Int
n
  | Bool
otherwise = String
xs

formatEStr :: Int -> Char -> String -> String
formatEStr :: Int -> Char -> String -> String
formatEStr Int
m Char
x String
xs 
  | Int
m forall a. Ord a => a -> a -> Bool
> Int
0 = String
xs forall a. Monoid a => a -> a -> a
`mappend` forall a. Int -> a -> [a]
replicate Int
m Char
x
  | Bool
otherwise = String
xs

formatBothStr :: Int -> Int -> Char -> String -> String
formatBothStr :: Int -> Int -> Char -> String -> String
formatBothStr Int
m Int
n Char
x = Int -> Char -> String -> String
formatBStr Int
m Char
x forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Char -> String -> String
formatEStr Int
n Char
x
{-# INLINE formatBothStr  #-}

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