1
1
mirror of https://github.com/github/semantic.git synced 2024-12-24 15:35:14 +03:00
semantic/src/Source.hs

35 lines
1.0 KiB
Haskell
Raw Normal View History

2015-12-24 06:38:02 +03:00
module Source where
import Range
2015-12-24 06:48:31 +03:00
import qualified Data.Vector as Vector
newtype Source a = Source { getVector :: Vector.Vector a }
deriving (Eq, Show, Functor, Foldable)
makeSource :: [a] -> Source a
2015-12-24 06:48:31 +03:00
makeSource = Source . Vector.fromList
unSource :: Source a -> [a]
2015-12-24 06:48:31 +03:00
unSource (Source vector) = Vector.toList vector
subsource :: Range -> Source a -> Source a
2015-12-24 07:22:29 +03:00
subsource range (Source vector) = Source $ Vector.slice (start range) (end range - start range) vector
toString :: Source Char -> String
toString = unSource
at :: Source a -> Int -> a
at = (!!) . unSource
null :: Source a -> Bool
null (Source vector) = Vector.null vector
2015-12-24 07:05:01 +03:00
2015-12-24 07:06:49 +03:00
cons :: a -> Source a -> Source a
cons a = Source . Vector.cons a . getVector
2015-12-24 07:05:01 +03:00
uncons :: Source a -> Maybe (a, Source a)
uncons (Source vector) = if Vector.null vector then Nothing else Just (Vector.head vector, Source $ Vector.tail vector)
2015-12-24 07:16:09 +03:00
break :: (a -> Bool) -> Source a -> (Source a, Source a)
break predicate (Source vector) | (start, remainder) <- Vector.break predicate vector = (Source start, Source remainder)