module Data.SExp.Data
( Atom(..), AntiAtom(..)
, OpenLink(..) , OpenSExp(..)
, SExp(..), SExpLink(..)
, DualSExp(..), DualSExpLink(..)
) where
import Data.Generics
data Atom =
StringAtom String
| BooleanAtom Bool
| IntegerAtom Integer
| FloatingAtom Double
| SymbolAtom String
deriving (Eq, Ord, Show, Typeable, Data)
data AntiAtom =
ValueAntiAtom String
| AtomAntiAtom String
| StringAntiAtom String
| BooleanAntiAtom String
| IntegerAntiAtom String
| FloatingAntiAtom String
| SymbolAntiAtom String
deriving (Eq, Ord, Show, Typeable, Data)
data OpenLink sd sl =
NullLink
| ConsLink sd sl
deriving (Eq, Ord, Show, Typeable, Data)
data OpenSExp sl =
AtomSExp Atom
| LinkSExp sl
deriving (Eq, Ord, Show, Typeable, Data)
newtype SExp = SExp { unSExp :: OpenSExp SExpLink }
deriving (Eq, Ord, Show, Typeable, Data)
newtype SExpLink = SExpLink { unSExpLink :: OpenLink SExp SExpLink }
deriving (Eq, Ord, Show, Typeable, Data)
data DualSExp =
PositiveDualSExp (OpenSExp DualSExpLink)
| AntiAtomDualSExp AntiAtom
deriving (Eq, Ord, Show, Typeable, Data)
data DualSExpLink =
PositiveDualSExpLink (OpenLink DualSExp DualSExpLink)
| AntiConsDualSExpLink String
deriving (Eq, Ord, Show, Typeable, Data)