content: -----------------------------------------------------------------------------
  -- |
  -- Module      :  Diagrams.Points
  -- Copyright   :  (c) 2011 diagrams-lib team (see LICENSE)
  -- License     :  BSD-style (see LICENSE)
  -- Maintainer  :  diagrams-discuss@googlegroups.com
  --
  -- Points in space.  For more tools for working with points and
  -- vectors, see "Linear.Affine".
  --
  -----------------------------------------------------------------------------
  
  module Diagrams.Points
         ( -- * Points
           Point (..), origin, (*.)
  
           -- * Point-related utilities
         , centroid
         , pointDiagram
         , _Point, lensP
         ) where
  
  import           Diagrams.Core        (pointDiagram)
  import           Diagrams.Core.Points
  
  import           Data.Foldable        as F
  
  import           Linear.Affine
  import           Linear.Vector
  
  -- | The centroid of a set of /n/ points is their sum divided by /n/.
  --   Returns the origin for an empty list of points.
  centroid :: (Additive v, Fractional n) => [Point v n] -> Point v n
  centroid [] = origin
  centroid ps = meanV ps
  {-# INLINE centroid #-}
  
  meanV :: (Foldable f, Additive v, Fractional a) => f (v a) -> v a
  meanV = uncurry (^/) . F.foldl' (\(s,c) e -> (e ^+^ s,c+1)) (zero,0)
  {-# INLINE meanV #-}
  
  