-- | A collection of 'String'-handling routines as well as one for making tables.
module Language.Drasil.Misc (mkTable, repUnd) where

{- |
  Create a table body (not including header row) by applying the given
  functions to the column elements of the table rows (in order).
  The first argument is a list of functions to be applied (one per column).
  This essentially creates the rows.
  The second argument is a list of elements apply the functions to.

  For example, @mkTable [id, *5] [1,2,3]@ should produce a table:
  
  > | 1 |  5 |
  > | 2 | 10 |
  > | 3 | 15 |
  
-}
mkTable :: [a -> b] -> [a] -> [[b]]
mkTable :: forall a b. [a -> b] -> [a] -> [[b]]
mkTable [a -> b]
fs = (a -> [b]) -> [a] -> [[b]]
forall a b. (a -> b) -> [a] -> [b]
map (\a
x -> ((a -> b) -> b) -> [a -> b] -> [b]
forall a b. (a -> b) -> [a] -> [b]
map ((a -> b) -> a -> b
forall a b. (a -> b) -> a -> b
$ a
x) [a -> b]
fs)

-- | Replace underscores in a string with periods (@.@).
repUnd :: String -> String
repUnd :: String -> String
repUnd = (Char -> Char) -> String -> String
forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
rep
  where
    rep :: Char -> Char
    rep :: Char -> Char
rep Char
'_' = Char
'.'
    rep Char
c = Char
c