-- TODO rename cut marks (they are too long)
module Text.Layout.Table.Spec.CutMark
    ( CutMark
    , doubleCutMark
    , singleCutMark
    , noCutMark
    , leftMark
    , rightMark
    , ellipsisCutMark
    ) where

import Data.Default.Class

-- | Specifies a cut mark that is used whenever content is cut to fit into a
-- cell.  If the cut mark itself is too small to fit into a cell it may be cut
-- as well.
data CutMark
    = CutMark
    { CutMark -> String
leftMark  :: String
    , CutMark -> String
rightMark :: String
    } deriving (Int -> CutMark -> ShowS
[CutMark] -> ShowS
CutMark -> String
(Int -> CutMark -> ShowS)
-> (CutMark -> String) -> ([CutMark] -> ShowS) -> Show CutMark
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CutMark] -> ShowS
$cshowList :: [CutMark] -> ShowS
show :: CutMark -> String
$cshow :: CutMark -> String
showsPrec :: Int -> CutMark -> ShowS
$cshowsPrec :: Int -> CutMark -> ShowS
Show, CutMark -> CutMark -> Bool
(CutMark -> CutMark -> Bool)
-> (CutMark -> CutMark -> Bool) -> Eq CutMark
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CutMark -> CutMark -> Bool
$c/= :: CutMark -> CutMark -> Bool
== :: CutMark -> CutMark -> Bool
$c== :: CutMark -> CutMark -> Bool
Eq)

-- | A single ellipsis unicode character is used to show cut marks.
instance Default CutMark where
    def :: CutMark
def = CutMark
ellipsisCutMark

-- | The default 'CutMark' is a single ellipsis unicode character on each side.
ellipsisCutMark :: CutMark
ellipsisCutMark :: CutMark
ellipsisCutMark = String -> CutMark
singleCutMark String
"…"

-- | Specify two different cut marks, one for cuts on the left and one for cuts
-- on the right.
doubleCutMark :: String -> String -> CutMark
doubleCutMark :: String -> String -> CutMark
doubleCutMark = String -> String -> CutMark
CutMark

-- | Use the cut mark on both sides by reversing it on the other.
singleCutMark :: String -> CutMark
singleCutMark :: String -> CutMark
singleCutMark String
l = String -> String -> CutMark
doubleCutMark String
l (ShowS
forall a. [a] -> [a]
reverse String
l)

-- | Do not show any cut mark when content is cut.
noCutMark :: CutMark
noCutMark :: CutMark
noCutMark = String -> CutMark
singleCutMark String
""