{-# LANGUAGE FlexibleContexts #-}
-- | Alignment options,
--   and extracting common columns
--   from tuples used in analysis.
module Alignment where

import Data.Text         ( Text )
import Data.Tuple.Optics ( Field1(..), Field3(..) )
import Optics.Lens       ( Lens' )

import Token ( MyLoc, MyTok )

-- | Datatype to present columns with alignment requirements.
data Align =
    ALeft   -- ^ Align to the left of the cell
  | ACenter -- ^ Align to the center of the cell
  | AIndent -- ^ Indentation spacing: whitespace with minimum width to preserve
  deriving (Align -> Align -> Bool
(Align -> Align -> Bool) -> (Align -> Align -> Bool) -> Eq Align
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Align -> Align -> Bool
== :: Align -> Align -> Bool
$c/= :: Align -> Align -> Bool
/= :: Align -> Align -> Bool
Eq, Eq Align
Eq Align =>
(Align -> Align -> Ordering)
-> (Align -> Align -> Bool)
-> (Align -> Align -> Bool)
-> (Align -> Align -> Bool)
-> (Align -> Align -> Bool)
-> (Align -> Align -> Align)
-> (Align -> Align -> Align)
-> Ord Align
Align -> Align -> Bool
Align -> Align -> Ordering
Align -> Align -> Align
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Align -> Align -> Ordering
compare :: Align -> Align -> Ordering
$c< :: Align -> Align -> Bool
< :: Align -> Align -> Bool
$c<= :: Align -> Align -> Bool
<= :: Align -> Align -> Bool
$c> :: Align -> Align -> Bool
> :: Align -> Align -> Bool
$c>= :: Align -> Align -> Bool
>= :: Align -> Align -> Bool
$cmax :: Align -> Align -> Align
max :: Align -> Align -> Align
$cmin :: Align -> Align -> Align
min :: Align -> Align -> Align
Ord, Int -> Align -> ShowS
[Align] -> ShowS
Align -> String
(Int -> Align -> ShowS)
-> (Align -> String) -> ([Align] -> ShowS) -> Show Align
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Align -> ShowS
showsPrec :: Int -> Align -> ShowS
$cshow :: Align -> String
show :: Align -> String
$cshowList :: [Align] -> ShowS
showList :: [Align] -> ShowS
Show)

-- | Records tokenized and converted to common token format.
type Processed = (MyTok        -- Token type
                 ,MyLoc        -- Token location
                 ,Text         -- Text content
                 ,Maybe Int    -- Indent column
                 ,Maybe (Align -- Alignment mark
                        ,Int)  -- Alignment column
                 )

 

-- | Access text content.
tokenType :: Field1 a a MyTok MyTok => Lens' a MyTok
tokenType :: forall a. Field1 a a MyTok MyTok => Lens' a MyTok
tokenType  = Lens a a MyTok MyTok
forall s t a b. Field1 s t a b => Lens s t a b
_1

-- | Access text content.
textContent :: Field3 a a Text Text => Lens' a Text
textContent :: forall a. Field3 a a Text Text => Lens' a Text
textContent  = Lens a a Text Text
forall s t a b. Field3 s t a b => Lens s t a b
_3