module Numeric.Regression.Internal where

import Control.Applicative
import Data.Foldable
import Data.Monoid

data Acc a = Acc {-# UNPACK #-} !Int !a

instance Monoid a => Monoid (Acc a) where
  mempty = Acc 0 mempty

  Acc m a `mappend` Acc n b = Acc (m + n) (a <> b)

acc :: a -> Acc (Sum a)
acc = Acc 1 . Sum

dot :: (Applicative v, Foldable v, Num a)
    => v a
    -> v a
    -> a
dot x y = getSum . foldMap Sum $ liftA2 (*) x y