module TSort where
import Data.List

tsort::Eq a=>[a]->(a->a->Bool)->[a]
tsort [] _ = []
tsort elems mustComeBefore =
    let canBeScheduled e1 = all (\e2 -> not (e2 `mustComeBefore` e1)) elems
        Just first = find canBeScheduled elems
        rest = delete first elems
    in first:tsort rest mustComeBefore