{-|
  Module      : Text.ANTLR.Language
  Description : Viewing a language as a set of words accepted
  Copyright   : (c) Karl Cronburg, 2018
  License     : BSD3
  Maintainer  : karl@cs.tufts.edu
  Stability   : experimental
  Portability : POSIX

-}
module Text.ANTLR.Language
  ( Alphabet(..), ascii, isASCII
  ) where
import Prelude hiding (Word)
import Data.Set.Monad (Set(..))
import qualified Data.Set.Monad as Set

import Data.Char

type Alphabet a = Set a

ascii :: Alphabet Char
ascii :: Alphabet Char
ascii     = [Char] -> Alphabet Char
forall a. Ord a => [a] -> Set a
Set.fromList ([Char] -> Alphabet Char) -> [Char] -> Alphabet Char
forall a b. (a -> b) -> a -> b
$ (Int -> Char) -> [Int] -> [Char]
forall a b. (a -> b) -> [a] -> [b]
map Int -> Char
chr [0 .. 127]

isASCII :: Char -> Bool
isASCII :: Char -> Bool
isASCII c :: Char
c = Char -> Int
ord Char
c Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< 127

type Word a = [a]

type Language a = Set (Word a) 

union :: (Ord a) => Set a -> Set a -> Set a
union :: Set a -> Set a -> Set a
union  = Set a -> Set a -> Set a
forall a. Ord a => Set a -> Set a -> Set a
Set.union

concat :: (Ord a) => Language a -> Language a -> Language a
concat :: Language a -> Language a -> Language a
concat a :: Language a
a b :: Language a
b = [[a]] -> Language a
forall a. Ord a => [a] -> Set a
Set.fromList
  [ [a]
s [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a]
t
  | [a]
s <- Language a -> [[a]]
forall a. Ord a => Set a -> [a]
Set.toList Language a
a
  , [a]
t <- Language a -> [[a]]
forall a. Ord a => Set a -> [a]
Set.toList Language a
b
  ]

kleene :: a
kleene = a
forall a. HasCallStack => a
undefined