mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-11 05:49:31 -06:00
51 lines
1.3 KiB
Haskell
51 lines
1.3 KiB
Haskell
---------------------------------------------------------------------
|
|
-- |
|
|
-- Maintainer : Krasimir Angelov
|
|
-- Stability : (stable)
|
|
-- Portability : (portable)
|
|
--
|
|
-- Definitions of ranges, and operations on ranges
|
|
-----------------------------------------------------------------------------
|
|
|
|
module GF.Parsing.FCFG.Range
|
|
( RangeRec, Range(..), makeRange, concatRange, rangeEdge, edgeRange, minRange, maxRange,
|
|
) where
|
|
|
|
|
|
-- GF modules
|
|
import GF.Formalism.Utilities
|
|
import GF.Infra.PrintClass
|
|
|
|
------------------------------------------------------------
|
|
-- ranges as single pairs
|
|
|
|
type RangeRec = [Range]
|
|
|
|
data Range = Range {-# UNPACK #-} !Int {-# UNPACK #-} !Int
|
|
| EmptyRange
|
|
deriving (Eq, Ord)
|
|
|
|
makeRange :: Int -> Int -> Range
|
|
makeRange = Range
|
|
|
|
concatRange :: Range -> Range -> [Range]
|
|
concatRange EmptyRange rng = return rng
|
|
concatRange rng EmptyRange = return rng
|
|
concatRange (Range i j) (Range j' k) = [Range i k | j==j']
|
|
|
|
rangeEdge :: a -> Range -> Edge a
|
|
rangeEdge a (Range i j) = Edge i j a
|
|
|
|
edgeRange :: Edge a -> Range
|
|
edgeRange (Edge i j _) = Range i j
|
|
|
|
minRange :: Range -> Int
|
|
minRange (Range i j) = i
|
|
|
|
maxRange :: Range -> Int
|
|
maxRange (Range i j) = j
|
|
|
|
instance Print Range where
|
|
prt (Range i j) = "(" ++ show i ++ "-" ++ show j ++ ")"
|
|
prt (EmptyRange) = "(?)"
|