packages feed

g2-0.1.0.1: quasiquote/RegEx/RegEx.hs

{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}

module RegEx.RegEx where

import Data.Data
import G2.QuasiQuotes.G2Rep


data RegEx = Empty | Epsilon | Atom Char
  | Star RegEx | Concat RegEx RegEx | Or RegEx RegEx
  deriving (Show, Eq, Data)

$(derivingG2Rep ''RegEx)

match :: RegEx -> String -> Bool
match Empty _        = False
match Epsilon s      = null s
match (Atom x) s     = s == [x]
match (Star _) []    = True
match r@(Star x) s   = any (match2 x r)
                           (splits [1..length s] s)
match (Concat a b) s = any (match2 a b)
                           (splits [0..length s] s)
match (Or a b) s     = match a s || match b s

match2 :: RegEx -> RegEx -> (String, String) -> Bool
match2 a b (sa, sb)  = match a sa && match b sb

splits :: [Int] -> [a] -> [([a], [a])]
splits ns x = map (\n -> splitAt n x) ns