aboutsummaryrefslogtreecommitdiff
path: root/tests/bkpregex
diff options
context:
space:
mode:
Diffstat (limited to 'tests/bkpregex')
-rw-r--r--tests/bkpregex/Setup.hs2
-rw-r--r--tests/bkpregex/bkpregex.cabal29
-rw-r--r--tests/bkpregex/regex-example/Main.hs12
-rw-r--r--tests/bkpregex/regex-indef/Regex.hs14
-rw-r--r--tests/bkpregex/regex-indef/Str.hsig9
-rw-r--r--tests/bkpregex/regex-types/Regex/Types.hs7
-rw-r--r--tests/bkpregex/str-impls/Str/ByteString.hs17
-rw-r--r--tests/bkpregex/str-impls/Str/String.hs21
8 files changed, 111 insertions, 0 deletions
diff --git a/tests/bkpregex/Setup.hs b/tests/bkpregex/Setup.hs
new file mode 100644
index 0000000..9a994af
--- /dev/null
+++ b/tests/bkpregex/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/tests/bkpregex/bkpregex.cabal b/tests/bkpregex/bkpregex.cabal
new file mode 100644
index 0000000..678ddbb
--- /dev/null
+++ b/tests/bkpregex/bkpregex.cabal
@@ -0,0 +1,29 @@
+name: bkpregex
+version: 0.1.0.0
+build-type: Simple
+cabal-version: >=2.0
+
+library str-impls
+ build-depends: base, bytestring
+ exposed-modules: Str.String, Str.ByteString
+ hs-source-dirs: str-impls
+
+library regex-types
+ build-depends: base
+ exposed-modules: Regex.Types
+ hs-source-dirs: regex-types
+
+library regex-indef
+ build-depends: base, regex-types
+ signatures: Str
+ exposed-modules: Regex
+ hs-source-dirs: regex-indef
+
+executable regex-example
+ main-is: Main.hs
+ build-depends: base, regex-indef, regex-types, str-impls
+ mixins: regex-indef (Regex as Regex.String)
+ requires (Str as Str.String),
+ regex-indef (Regex as Regex.ByteString)
+ requires (Str as Str.ByteString)
+ hs-source-dirs: regex-example
diff --git a/tests/bkpregex/regex-example/Main.hs b/tests/bkpregex/regex-example/Main.hs
new file mode 100644
index 0000000..76d2974
--- /dev/null
+++ b/tests/bkpregex/regex-example/Main.hs
@@ -0,0 +1,12 @@
+{-# LANGUAGE OverloadedStrings #-}
+module Main where
+
+import Regex.Types
+import qualified Regex.String
+import qualified Regex.ByteString
+
+nocs = Rep (Alt (Sym 'a') (Sym 'b'))
+onec = Seq nocs (Sym 'c')
+evencs = Seq (Rep (Seq onec onec)) nocs
+main = print (Regex.String.accept evencs "acc") >>
+ print (Regex.ByteString.accept evencs "acc")
diff --git a/tests/bkpregex/regex-indef/Regex.hs b/tests/bkpregex/regex-indef/Regex.hs
new file mode 100644
index 0000000..506566b
--- /dev/null
+++ b/tests/bkpregex/regex-indef/Regex.hs
@@ -0,0 +1,14 @@
+module Regex where
+
+import Prelude hiding (null)
+import Str
+import Regex.Types
+
+accept :: Reg -> Str -> Bool
+accept Eps u = null u
+accept (Sym c) u = u == singleton c
+accept (Alt p q) u = accept p u || accept q u
+accept (Seq p q) u =
+ or [accept p u1 && accept q u2 | (u1, u2) <- splits u]
+accept (Rep r) u =
+ or [and [accept r ui | ui <- ps] | ps <- parts u]
diff --git a/tests/bkpregex/regex-indef/Str.hsig b/tests/bkpregex/regex-indef/Str.hsig
new file mode 100644
index 0000000..23bfb8c
--- /dev/null
+++ b/tests/bkpregex/regex-indef/Str.hsig
@@ -0,0 +1,9 @@
+signature Str where
+
+data Str
+instance Eq Str
+
+null :: Str -> Bool
+singleton :: Char -> Str
+splits :: Str -> [(Str, Str)]
+parts :: Str -> [[Str]]
diff --git a/tests/bkpregex/regex-types/Regex/Types.hs b/tests/bkpregex/regex-types/Regex/Types.hs
new file mode 100644
index 0000000..2900749
--- /dev/null
+++ b/tests/bkpregex/regex-types/Regex/Types.hs
@@ -0,0 +1,7 @@
+module Regex.Types where
+
+data Reg = Eps
+ | Sym Char
+ | Alt Reg Reg
+ | Seq Reg Reg
+ | Rep Reg
diff --git a/tests/bkpregex/str-impls/Str/ByteString.hs b/tests/bkpregex/str-impls/Str/ByteString.hs
new file mode 100644
index 0000000..cd49fed
--- /dev/null
+++ b/tests/bkpregex/str-impls/Str/ByteString.hs
@@ -0,0 +1,17 @@
+module Str.ByteString(module Data.ByteString.Char8, module Str.ByteString) where
+
+import Prelude hiding (length, null, splitAt)
+import Data.ByteString.Char8
+import Data.ByteString
+
+type Str = ByteString
+
+splits :: Str -> [(Str, Str)]
+splits s = fmap (\n -> splitAt n s) [0..length s]
+
+parts :: Str -> [[Str]]
+parts s | null s = [[]]
+ | otherwise = do
+ n <- [1..length s]
+ let (l, r) = splitAt n s
+ fmap (l:) (parts r)
diff --git a/tests/bkpregex/str-impls/Str/String.hs b/tests/bkpregex/str-impls/Str/String.hs
new file mode 100644
index 0000000..bba89de
--- /dev/null
+++ b/tests/bkpregex/str-impls/Str/String.hs
@@ -0,0 +1,21 @@
+module Str.String where
+
+import Prelude hiding (null)
+import qualified Prelude as P
+
+type Str = String
+
+null :: Str -> Bool
+null = P.null
+
+singleton :: Char -> Str
+singleton c = [c]
+
+splits :: Str -> [(Str, Str)]
+splits [] = [([], [])]
+splits (c:cs) = ([], c:cs):[(c:s1,s2) | (s1,s2) <- splits cs]
+
+parts :: Str -> [[Str]]
+parts [] = [[]]
+parts [c] = [[[c]]]
+parts (c:cs) = concat [[(c:p):ps, [c]:p:ps] | p:ps <- parts cs]