packages feed

hydra-0.1.0: src/main/haskell/Hydra/Sorting.hs

module Hydra.Sorting where

import qualified Data.List as L
import qualified Data.Bifunctor as BF


-- Note: requires a DAG (the ordering is incomplete in the presence of cycles).
topologicalSort :: Eq a => [(a, [a])] -> Maybe [a]
topologicalSort pairs = if L.length result < L.length pairs
    then Nothing
    else Just result
  where
    result = foldl makePrecede [] pairs
    makePrecede ts (x, xs) = L.nub $
      case L.elemIndex x ts of
        Just i -> uncurry (++) $ BF.first (++ xs) $ splitAt i ts
        _ -> ts ++ xs ++ [x]