module Text.Layout.Table.Vertical
(
vPad
, vPadAll
,
colsAsRowsAll
, colsAsRows
) where
import Data.List
import Text.Layout.Table.Spec.Position
import Text.Layout.Table.Spec.Util
import Text.Layout.Table.Primitives.Basic
colsAsRowsAll :: Monoid a => Position V -> [Col a] -> [Row a]
colsAsRowsAll :: Position V -> [Col a] -> [Col a]
colsAsRowsAll Position V
ps = [Col a] -> [Col a]
forall a. [[a]] -> [[a]]
transpose ([Col a] -> [Col a]) -> ([Col a] -> [Col a]) -> [Col a] -> [Col a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Position V -> [Col a] -> [Col a]
forall a. a -> Position V -> [Col a] -> [Col a]
vPadAll a
forall a. Monoid a => a
mempty Position V
ps
colsAsRows :: Monoid a => [Position V] -> [Col a] -> [Row a]
colsAsRows :: [Position V] -> [Col a] -> [Col a]
colsAsRows [Position V]
ps = [Col a] -> [Col a]
forall a. [[a]] -> [[a]]
transpose ([Col a] -> [Col a]) -> ([Col a] -> [Col a]) -> [Col a] -> [Col a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> [Position V] -> [Col a] -> [Col a]
forall a. a -> [Position V] -> [Col a] -> [Col a]
vPad a
forall a. Monoid a => a
mempty [Position V]
ps
vPadAll :: a -> Position V -> [Col a] -> [Col a]
vPadAll :: a -> Position V -> [Col a] -> [Col a]
vPadAll a
x = a -> [Position V] -> [Col a] -> [Col a]
forall a. a -> [Position V] -> [Col a] -> [Col a]
vPad a
x ([Position V] -> [Col a] -> [Col a])
-> (Position V -> [Position V]) -> Position V -> [Col a] -> [Col a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Position V -> [Position V]
forall a. a -> [a]
repeat
vPad :: a -> [Position V] -> [Col a] -> [Col a]
vPad :: a -> [Position V] -> [Col a] -> [Col a]
vPad a
x [Position V]
vs [Col a]
l = (Position V -> Col a -> Col a)
-> [Position V] -> [Col a] -> [Col a]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Position V -> Col a -> Col a
forall orientation. Position orientation -> Col a -> Col a
fillToMax [Position V]
vs [Col a]
l
where
fillToMax :: Position orientation -> Col a -> Col a
fillToMax Position orientation
vPos = Position orientation -> Int -> Col a -> Col a
forall orientation. Position orientation -> Int -> Col a -> Col a
fillTo Position orientation
vPos (Int -> Col a -> Col a) -> Int -> Col a -> Col a
forall a b. (a -> b) -> a -> b
$ [Int] -> Int
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum ([Int] -> Int) -> [Int] -> Int
forall a b. (a -> b) -> a -> b
$ Int
0 Int -> [Int] -> [Int]
forall a. a -> [a] -> [a]
: (Col a -> Int) -> [Col a] -> [Int]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Col a -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Col a]
l
fillTo :: Position orientation -> Int -> Col a -> Col a
fillTo Position orientation
vPos = let f :: a -> Int -> [a] -> [a]
f = case Position orientation
vPos of
Position orientation
Start -> a -> Int -> [a] -> [a]
forall a. a -> Int -> [a] -> [a]
fillEnd
Position orientation
Center -> a -> Int -> [a] -> [a]
forall a. a -> Int -> [a] -> [a]
fillBoth
Position orientation
End -> a -> Int -> [a] -> [a]
forall a. a -> Int -> [a] -> [a]
fillStart
in a -> Int -> Col a -> Col a
forall a. a -> Int -> [a] -> [a]
f a
x