module Data.SExp.Data
( Atom(..), AntiAtom(..)
, OpenLink(..) , OpenSExp(..)
, SExp(..), SExpLink(..)
, DualSExp(..), DualSExpLink(..)
, sexpSymbolValue, sexpToList, sexpLinkToList, listToSExp, listToSExpLink
) 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
| ListAntiAtom 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)
| AntiConsValueDualSExpLink String
| AntiConsListDualSExpLink String
deriving (Eq, Ord, Show, Typeable, Data)
sexpSymbolValue :: SExp -> Maybe String
sexpSymbolValue (SExp (AtomSExp (SymbolAtom s))) = Just s
sexpSymbolValue _ = Nothing
sexpToList :: SExp -> Maybe [SExp]
sexpToList (SExp (LinkSExp l)) = Just $ sexpLinkToList l
sexpToList _ = Nothing
sexpLinkToList :: SExpLink -> [SExp]
sexpLinkToList (SExpLink NullLink) = []
sexpLinkToList (SExpLink (ConsLink h t)) = h:sexpLinkToList t
listToSExp :: [SExp] -> SExp
listToSExp ss = SExp . LinkSExp $ listToSExpLink ss
listToSExpLink :: [SExp] -> SExpLink
listToSExpLink [] = SExpLink NullLink
listToSExpLink (s:ss) = SExpLink . ConsLink s $ listToSExpLink ss