packages feed

debug-0.1: test/Util.hs

{-# LANGUAGE OverloadedLists #-}
{-# LANGUAGE RecordWildCards #-}
module Util(equivalentTrace) where

import Data.Set (Set)
import qualified Data.Set as Set
import Data.Text (Text)
import Debug.DebugTrace

equivalentTrace :: DebugTrace -> DebugTrace -> Bool
equivalentTrace tr1 tr2 =
  Set.fromList (functions tr1)  == Set.fromList (functions tr2) &&
  Set.fromList (variables tr1)  == Set.fromList (variables tr2) &&
  Set.fromList (fleshCalls tr1) == Set.fromList (fleshCalls tr2)

data FleshedCallData = FleshedCallData
  { function :: Function
  , depends, parents :: Set FleshedCallData
  , vals :: Set (Text, Text)
  }
  deriving (Eq, Ord)

fleshCalls :: DebugTrace -> [FleshedCallData]
fleshCalls DebugTrace{..} = map fleshCall calls
  where
    result = map fleshCall calls
    sansStack call = call{depends = [], parents = []}
    fleshCall CallData{..} = FleshedCallData{..} where
      function = functions !! callFunctionId
      depends  = Set.fromList $ map (sansStack . (result !!)) callDepends
      parents  = Set.fromList $ map (sansStack . (result !!)) callParents
      vals     = Set.fromList [ (label, variables !! v) | (label,v) <- callVals ]