{-# LANGUAGE DeriveGeneric   #-}
{-# LANGUAGE RecordWildCards #-}

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

import           Data.Map
import           Data.SyntaxTree
import           Protolude

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

-- |  All relations having as "head" the given index
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]
  } 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)