module Graphics.Implicit.ExtOpenScad.Parser.Util where

import Graphics.Implicit.Definitions
import Text.ParserCombinators.Parsec  hiding (State)
import Text.ParserCombinators.Parsec.Expr
import Graphics.Implicit.ExtOpenScad.Definitions

-- white space, including tabs, newlines and comments
genSpace = many $ 
	oneOf " \t\n\r" 
	<|> (try $ do
		string "//"
		many ( noneOf "\n")
		string "\n"
		return ' '
	) <|> (try $ do
		string "/*"
		manyTill anyChar (try $ string "*/")
		return ' '
	)

pad parser = do
	genSpace
	a <- parser
	genSpace
	return a

tryMany = (foldl1 (<|>)) . (map try)

variableSymb = many1 (noneOf " ,|[]{}()+-*&^%#@!~`'\"\\/;:.,<>?=") <?> "variable"


patternMatcher :: GenParser Char st Pattern
patternMatcher =
	(do 
		char '_'
		return Wild
	) <|> {-( do
		a <- literal
		return $ \obj ->
			if obj == (a undefined)
			then Just (Map.empty)
			else Nothing
	) <|> -} ( do
		symb <- variableSymb
		return $ Name symb
	) <|> ( do
		char '['
		genSpace
		components <- patternMatcher `sepBy` (try $ genSpace >> char ',' >> genSpace)
		genSpace
		char ']'
		return $ ListP components
	)