1 {-# LANGUAGE DeriveFunctor #-}
2 {-# LANGUAGE RecordWildCards #-}
3 module Language.TCT.Cell where
5 import Data.Eq (Eq(..))
6 import Data.Function (($), (.))
7 import Data.Functor (Functor)
8 import Data.Maybe (Maybe(..))
9 import Data.Monoid (Monoid(..))
10 import Data.Ord (Ord(..))
11 import Data.Semigroup (Semigroup(..))
12 import Data.Sequence (Seq, ViewL(..), ViewR(..))
13 import Data.TreeSeq.Strict (Tree(..))
15 import Text.Show (Show(..), showParen, showString, showChar)
16 import qualified Data.Sequence as Seq
19 -- | NOTE: every 'Cell' as a 'Pos',
20 -- which is useful to indicate matches/errors/warnings/whatever,
21 -- or outputing in a format somehow preserving
22 -- the original input style.
25 { posCell :: {-# UNPACK #-} !Pos
26 , posEndCell :: {-# UNPACK #-} !Pos
28 } deriving (Eq, Ord, Functor)
29 instance Show a => Show (Cell a) where
30 showsPrec p Cell{..} =
33 showChar ' ' . showsPrec 10 posCell .
34 showChar ' ' . showsPrec 10 posEndCell .
35 showChar ' ' . showsPrec 11 unCell
37 instance Semigroup a => Semigroup (Cell a) where
38 Cell bx ex x <> Cell by ey y =
39 Cell (bx`min`by) (ex`max`ey) (x<>y)
40 instance (Monoid a, Semigroup a) => Monoid (Cell a) where
41 mempty = Cell pos1 pos1 mempty
45 lineCell :: Cell a -> Line
46 lineCell = linePos . posCell
47 columnCell :: Cell a -> Column
48 columnCell = columnPos . posCell
51 cell0 = Cell pos0 pos0
53 cell1 = Cell pos1 pos1
55 posSeq :: Seq (Cell a) -> Maybe (Pos,Pos)
57 case Seq.viewl toks of
60 case Seq.viewr toks of
66 posTrees :: Seq (Trees (Cell k) a) -> Maybe (Pos,Pos)
68 case Seq.viewl trees of
72 Nothing -> posTrees ts
75 case Seq.viewr trees of
77 _ :> TreeN _ toks | iiiii->
79 TreeN (Cell bp _ep _) _ :< _ ->
80 case Seq.viewr trees of
82 _ :> TreeN _ toks | iiiii->
89 { linePos :: {-# UNPACK #-} !Line
90 , columnPos :: {-# UNPACK #-} !Column
92 instance Show Pos where
93 showsPrec _p pos = showsPrec 11 (linePos pos,columnPos pos)
94 instance Ord Pos where
95 Pos lx cx `compare` Pos ly cy =
99 posTree :: Tree (Cell k) (Cell a) -> Pos
100 posTree (TreeN c _) = posCell c
101 posTree (Tree0 c) = posCell c
103 posEndTree :: Tree (Cell k) (Cell a) -> Pos
104 posEndTree (TreeN c _) = posEndCell c
105 posEndTree (Tree0 c) = posEndCell c
113 -- | Line in the source file, counting from 1.
117 -- | Column in the source file, counting from 1.