module GraphRewriting.Layout.Gravitation where
import Data.View
import Data.Vector.Class
import Data.Vector.V2
import Control.Monad
import GraphRewriting.Graph.Types
import GraphRewriting.Graph.Read
import GraphRewriting.Layout.Position
import GraphRewriting.Layout.Force
centralGravitation ∷ View Position n ⇒ Node → WithGraph n Force
centralGravitation = liftM (attraction $ vpromote 0) . examineNode position
gravitation ∷ View Position n ⇒ Node -> Rewrite n Force
gravitation node = do
n ← examineNode position node
ns ← mapM (examineNode position) =<< readNodeList
return $ fsum [attraction n' n | n' ← ns]