module Relax(relax, Comparer, Combiner) where import Graph import PropertyMap type Combiner a = a -> a -> a type Comparer a = a -> a -> Bool relax :: (Graph g e v, ReadWritePropertyMap d v n, ReadWritePropertyMap p v v, ReadPropertyMap w e n) => e -> g -> w -> d -> p -> (Combiner n) -> (Comparer n) -> (d,p,Bool) relax e g w d p plus less = let { u = src e g; v = tgt e g; du = get d u; dv = get d v; we = get w e } in if (less (plus du we) dv) then (put d v (plus du we), put p v u, True) else (d, p, False)