module Data.ParsedSentence
  ( module Data.ParsedSentence
  , module Data.SyntaxTree
  ) where

import           Protolude
import           Data.SyntaxTree
import           Data.Map

--------------------------------------------------------------------------------

-- | 
data ParsedSentence cpos fpos ger feats lemma =
  ParsedSentence
  { _rootNode    :: SyntaxtTree cpos fpos ger feats lemma
  , _indexToNode :: Map Int (SyntaxtTree cpos fpos ger feats lemma)
  , _headToNode  :: Map Int [SyntaxtTree cpos fpos ger feats lemma] 
                    -- ^ All relations having as "head" the given index  
  } deriving(Show,Read,Eq,Generic)

-- |
sentenceFromRootNode :: SyntaxtTree cpos fpos ger feats lemma
                     -> ParsedSentence cpos fpos ger feats lemma
sentenceFromRootNode _rootNode =
  ParsedSentence{..}
    where
      _indexToNode = fromList          [ (_tnId   $ rootLabel node, node ) | node <- everyNode]    
      _headToNode  = fromListWith (++) [ (_tnHead $ rootLabel node,[node]) | node <- everyNode]
      everyNode    = everyNodeFrom _rootNode
      everyNodeFrom node@(Node _ children) = node:( everyNodeFrom =<< children)