edges-0.6: library/Edges/Folds.hs
module Edges.Folds
where
import Edges.Prelude
import Edges.Types
import Edges.Data
import qualified PrimitiveExtras.PrimArray as PrimArray
import qualified PrimitiveExtras.PrimMultiArray as PrimMultiArray
edgeCounts :: Amount a -> Fold (Node a, Node b) (EdgeCounts a b)
edgeCounts (Amount amountInt) =
dimap edgeSourceIndex EdgeCounts (PrimArray.indexCountsFold amountInt)
where
edgeSourceIndex (Node sourceIndex, _) = sourceIndex
edges :: EdgeCounts a b -> Amount b -> Fold (Node a, Node b) (Edges a b)
edges (EdgeCounts edgeCountsPrimArray) (Amount bAmountInt) =
dimap edgePair (Edges bAmountInt) (PrimMultiArray.fold edgeCountsPrimArray)
where
edgePair (Node sourceIndex, Node targetIndex) = (sourceIndex, fromIntegral targetIndex)