{-# LANGUAGE ScopedTypeVariables #-}

module Graph.DijkstraSimple.Weighters
  (
                                      -- * How weighters are used
                                      -- $use
    cumulativeWeighter
  , maximumWeightWeighter
  )
where

import           Graph.DijkstraSimple

-- | The classical weighter: the weight of a path is the sum of each edge
-- weight.
cumulativeWeighter :: Num e => Weighter v e e
cumulativeWeighter = Weighter 0 $ \e p -> pathWeight p + edgeToWeight e

-- | Here we are looking for the heaviest edge weight
maximumWeightWeighter :: (Bounded e, Ord e) => Weighter v e e
maximumWeightWeighter =
  Weighter minBound $ \e p -> max (pathWeight p) (edgeToWeight e)

-- $use
--
-- Weighters requires two components:
--
--  - a value for the initial weight of a @Path@
--  - a function which gives a new output weight from an input weight (the edge weight) and a @Path@
--
-- The algorithm will try to minimize the output weight of paths.
--
-- Be sure that the output weight is always positive, it is not checked,
-- but it will break the algorithm.