module Data.STData.Data
( OpenSData(..), OpenTData(..)
, SData(..), SLink(..), TData(..), TLink(..)
, DualSData(..), DualSLink(..), DualTData(..), DualTLink(..)
, sdataToList
) where
import Data.Generics
import Text.Printf
import Data.SExp
data OpenSData sl tl =
AtomSData Atom
| SLinkSData sl
| TLinkSData tl
deriving (Eq, Ord, Show, Typeable, Data)
data OpenTData sl =
AtomTData String
| SLinkTData sl
deriving (Eq, Ord, Show, Typeable, Data)
newtype SData = SData { unSData :: OpenSData SLink TLink }
deriving (Eq, Ord, Show, Typeable, Data)
newtype SLink = SLink { unSLink :: OpenLink SData SLink }
deriving (Eq, Ord, Show, Typeable, Data)
newtype TData = TData { unTData :: OpenTData SLink }
deriving (Eq, Ord, Show, Typeable, Data)
newtype TLink = TLink { unTLink :: OpenLink TData TLink }
deriving (Eq, Ord, Show, Typeable, Data)
data DualSData =
PositiveDualSData (OpenSData DualSLink DualTLink)
| AntiAtomDualSData AntiAtom
deriving (Eq, Ord, Show, Typeable, Data)
data DualSLink =
PositiveDualSLink (OpenLink DualSData DualSLink)
| AntiConsDualSLink String
deriving (Eq, Ord, Show, Typeable, Data)
data DualTData = DualTData { unDualTData :: OpenTData DualSLink }
deriving (Eq, Ord, Show, Typeable, Data)
data DualTLink = DualTLink { unDualTLink :: OpenLink DualTData DualTLink }
deriving (Eq, Ord, Show, Typeable, Data)
sdataToList :: SData -> [SData]
sdataToList (SData (SLinkSData slink)) = slinkToList slink
sdataToList other = error $ printf "cannot convert sdata to list: %s" (show other)
slinkToList :: SLink -> [SData]
slinkToList (SLink NullLink) = []
slinkToList (SLink (ConsLink s ss)) = s : slinkToList ss