module Text.Layout.Table.Primitives.AlignSpec.Internal
    ( AlignSpec(..)
    , noAlign
    , occSpecAlign
    , predAlign
    , charAlign
    ) where

import Data.Default.Class

import Text.Layout.Table.Primitives.Occurence

-- | Determines whether a column will align at a specific letter.
data AlignSpec
    = AlignOcc OccSpec
    | NoAlign

-- | No alignment is the default.
instance Default AlignSpec where
    def = noAlign

-- | Don't align text.
noAlign :: AlignSpec
noAlign = NoAlign

-- | Construct an 'AlignSpec' by giving an occurence specification.
occSpecAlign :: OccSpec -> AlignSpec
occSpecAlign = AlignOcc

-- | Align at the first match of a predicate.
predAlign :: (Char -> Bool) -> AlignSpec
predAlign = occSpecAlign . predOccSpec

-- | Align text at the first occurence of a given 'Char'.
charAlign :: Char -> AlignSpec
charAlign = predAlign . (==)