module Yi.Syntax.OnlineTree (Tree(..), manyToks,
tokAtOrBefore) where
import Prelude ()
import Control.Applicative
import Data.Traversable
import Data.Foldable
import Data.Monoid (mempty)
#ifdef TESTING
import Test.QuickCheck
import Parser.Incremental
#endif
import Yi.Buffer.Basic
import Yi.Prelude
import Yi.IncrementalParse
import Yi.Lexer.Alex
import Yi.Syntax.Tree
#ifdef TESTING
instance Arbitrary Point where
arbitrary = Point <$> arbitrary
#endif
data MaybeOneMore f x = None | OneMore x (f x)
deriving Show
data Tree a = Bin (Tree a) (Tree a)
| Leaf a
| Tip
deriving Show
instance IsTree Tree where
emptyNode = Tip
uniplate (Bin l r) = ([l,r],\[l',r'] -> Bin l' r')
uniplate t = ([],\_->t)
instance Traversable Tree where
traverse f (Bin l r) = Bin <$> traverse f l <*> traverse f r
traverse f (Leaf a) = Leaf <$> f a
traverse _ Tip = pure Tip
instance Foldable Tree where
foldMap _ Tip = mempty
foldMap f (Leaf a) = f a
foldMap f (Bin l r) = foldMap f l <> foldMap f r
instance Functor Tree where
fmap = fmapDefault
manyToks :: P (Tok t) (Tree (Tok t))
manyToks = manyToks' 1
manyToks' :: Int -> P a (Tree a)
manyToks' n = Look (pure Tip) (\_ -> Bin <$> subTree n <*> manyToks' (n * 2))
subTree :: Int -> P a (Tree a)
subTree n = Look (pure Tip) (\_ ->
case n of
0 -> pure Tip
1 -> Leaf <$> symbol (const True)
_ -> let m = n `div` 2 in Bin <$> subTree m <*> subTree m)