module Text.Trifecta.Parser.Layout.Prim
( LayoutToken(..)
, LayoutState(..)
, LayoutContext(..)
, LayoutMark(..)
, defaultLayoutState
, layoutBol
, layoutStack
) where
import Data.Functor
import Data.Lens.Common
import Data.Foldable
import Data.Semigroup.Foldable
import Data.Semigroup.Traversable
import Data.Traversable
import Text.Trifecta.Rope.Delta
import Text.Trifecta.Rope.Bytes
import Text.Trifecta.Diagnostic.Rendering.Prim
data LayoutToken
= VirtualSemi
| VirtualRightBrace
| WhiteSpace
| Other
deriving (Eq,Ord,Show,Read)
data LayoutContext
= IndentedLayout Rendering
| DisabledLayout Rendering
instance HasDelta LayoutContext where
delta (IndentedLayout r) = delta r
delta (DisabledLayout r) = delta r
instance HasBytes LayoutContext where
bytes = bytes . delta
data LayoutState = LayoutState
{ _layoutBol :: Bool
, _layoutStack :: [LayoutContext]
}
defaultLayoutState :: LayoutState
defaultLayoutState = LayoutState False []
layoutBol :: Lens LayoutState Bool
layoutBol = lens _layoutBol (\s l -> l { _layoutBol = s})
layoutStack :: Lens LayoutState [LayoutContext]
layoutStack = lens _layoutStack (\s l -> l { _layoutStack = s})
data LayoutMark d = LayoutMark LayoutState d
instance Functor LayoutMark where
fmap f (LayoutMark s a) = LayoutMark s (f a)
instance Foldable LayoutMark where
foldMap f (LayoutMark _ a) = f a
instance Traversable LayoutMark where
traverse f (LayoutMark s a) = LayoutMark s <$> f a
instance Foldable1 LayoutMark where
foldMap1 f (LayoutMark _ a) = f a
instance Traversable1 LayoutMark where
traverse1 f (LayoutMark s a) = LayoutMark s <$> f a
instance HasDelta d => HasDelta (LayoutMark d) where
delta (LayoutMark _ d) = delta d
instance HasBytes d => HasBytes (LayoutMark d) where
bytes (LayoutMark _ d) = bytes d