content: {-# LANGUAGE MultiParamTypeClasses
             , FlexibleInstances
             , UndecidableInstances
             , DeriveDataTypeable
             #-}
  
  module Numeric.Algebra.Incidence
    ( Interval(..)
    , zeta
    , moebius
    ) where
  
  import Data.Data
  import Numeric.Algebra.Class
  import Numeric.Algebra.Unital
  import Numeric.Algebra.Commutative
  import Numeric.Ring.Class
  import Numeric.Order.Class
  import Numeric.Order.LocallyFinite
  
  -- the basis for an incidence algebra
  data Interval a = Interval a a deriving (Eq,Ord,Show,Read,Data,Typeable)
  
  instance (Commutative r, Monoidal r, Semiring r, LocallyFiniteOrder a) => Algebra r (Interval a) where
    mult f (Interval a c) = sumWith (\b -> f (Interval a b) (Interval b c)) $ range a c
    
  instance (Commutative r, Monoidal r, Semiring r, LocallyFiniteOrder a) => UnitalAlgebra r (Interval a) where
    unit r (Interval a b) 
      | a ~~ b = r
      | otherwise = zero
  
  zeta :: Unital r => Interval a -> r
  zeta = const one
  
  moebius :: (Ring r, LocallyFiniteOrder a) => Interval a -> r
  moebius (Interval a b) = moebiusInversion a b
  