{-# LANGUAGE NamedFieldPuns, CPP #-}
{-# OPTIONS_GHC -F -pgmFderive -optF-F #-}
module Data.STAR.Type(
       STAR     (..),
       STARBlock(..),
       STAREntry(..),
       STARKey(..),
       String(..)
) where

import Data.ByteString.Char8 as BSC
import Prelude hiding(String)
import Control.DeepSeq
import Data.Binary

type String = BSC.ByteString

newtype STAR = STAR [STARBlock]
  deriving (Show, Eq)

data STARBlock = Global { entries     :: ![STAREntry]
                        }
               | Data   { dataKey     :: !String,
                          entries     :: ![STAREntry]
                        }
  deriving (Show, Eq)

{-
#ifdef DEFINE_NFDATA_BYTESTRING
instance NFData BSC.ByteString
  where
    rnf bs = bs `seq` ()
#endif
 -}

{-!

deriving instance Binary STARBlock
deriving instance Binary STAR
deriving instance Binary STAREntry

deriving instance NFData STARBlock
deriving instance NFData STAR
deriving instance NFData STAREntry
 !-}

{-
instance NFData STARBlock
  where
    rnf (Global   es) = rnf es
    rnf (Data   k es) = rnf es
-}

type STARKey = String

data STAREntry = Entry { key          :: !String,
                         value        :: !String
                       }
               | Ref   { key          :: !String,
                         value        :: !String
                       }
               | Frame { key          :: !String,
                         frameEntries :: ![STAREntry]
                       }
               | Loop  { table        :: ![[STAREntry]]
                       }
  deriving (Show, Eq)

{-
instance NFData STAREntry
  where
    rnf (Frame k vs) = rnf vs
    rnf (Loop    vs) = rnf vs
    rnf (Entry  _ _) = ()
    rnf (Ref    _ _) = ()
-}