packages feed

trifecta-0.1: Text/Trifecta/Cursor.hs

module Text.Trifecta.Cursor 
  ( Cursor(..)
  ) where

import Data.Hashable
import Data.Monoid
import Data.Sequence
import Data.Interned
import Data.Semigroup
import Data.Foldable

import Text.Trifecta.Delta

data Cursor = Cursor 
  { cursorBytes   :: {-# UNPACK #-} !Int
  , cursorDelta   :: !Delta
  , cursorSeqHash :: {-# UNPACK #-} !Int
  , cursorSeq     :: !(Seq Id)
  } deriving Show


instance Eq Cursor where
  Cursor _ _ h k == Cursor _ _ h' k' = h == h' && k == k'

instance Hashable Cursor where
  hash (Cursor _ _ _ s) = hash (toList s)
    
instance Monoid Cursor where
  mempty = Cursor 0 mempty 0 mempty
  Cursor s d l q `mappend` Cursor s' d' l' q' = Cursor (s + s') (d <> d') (l + l') (q <> q')

instance Semigroup Cursor where
  Cursor s d l q <> Cursor s' d' l' q' = Cursor (s + s') (d <> d') (l + l') (q <> q')