import Text.Parsec
import Control.Applicative ((<$), (<*), (*>), liftA)
import Text.Parsec
import Control.Applicative ((<$), (<*), (*>), liftA)
-import Data.List (partition, union, intersect)
+import Data.List (partition, union, intersect, tails)
+import Data.Char (isAlphaNum)
data Chunk = Include String | Exclude String deriving (Show)
data ChunkV = Includev Bool | Excludev Bool deriving (Show)
data Chunk = Include String | Exclude String deriving (Show)
data ChunkV = Includev Bool | Excludev Bool deriving (Show)
allowsAbba :: [ChunkV] -> Bool
allowsAbba chunks = (any (chunkValueV) includeChunks) && (not (any (chunkValueV) excludeChunks))
where (includeChunks, excludeChunks) = partition (isIncludeV) chunks
allowsAbba :: [ChunkV] -> Bool
allowsAbba chunks = (any (chunkValueV) includeChunks) && (not (any (chunkValueV) excludeChunks))
where (includeChunks, excludeChunks) = partition (isIncludeV) chunks
ieCandidates :: [Chunk] -> ([String], [String])
ieCandidates chunks = (includeCandidates, excludeCandidates)
ieCandidates :: [Chunk] -> ([String], [String])
ieCandidates chunks = (includeCandidates, excludeCandidates)