-- Communicating Haskell Processes.-- Copyright (c) 2008, University of Kent.-- All rights reserved.-- -- Redistribution and use in source and binary forms, with or without-- modification, are permitted provided that the following conditions are-- met:---- * Redistributions of source code must retain the above copyright-- notice, this list of conditions and the following disclaimer.-- * Redistributions in binary form must reproduce the above copyright-- notice, this list of conditions and the following disclaimer in the-- documentation and/or other materials provided with the distribution.-- * Neither the name of the University of Kent nor the names of its-- contributors may be used to endorse or promote products derived from-- this software without specific prior written permission.---- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS-- IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR-- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,-- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,-- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR-- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF-- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING-- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS-- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.-- | This module contains support for CSP-style tracing. A CSP trace is simply-- a flat list of events in the order in which they occurred.moduleControl.Concurrent.CHP.Traces.CSP(CSPTrace(..),getCSPPlain,runCHP_CSPTrace,runCHP_CSPTraceAndPrint)whereimportControl.Concurrent.STMimportControl.Monad.StateimportqualifiedData.MapasMapimportData.UniqueimportText.PrettyPrint.HughesPJimportControl.Concurrent.CHP.BaseimportControl.Concurrent.CHP.Traces.Base-- | A classic CSP trace. It is simply the channel labels, and a list of recorded-- events in sequence -- the head of the list is the first (oldest) event.newtypeCSPTraceu=CSPTrace(ChannelLabelsu,[RecordedEventu])instanceOrdu=>Show(CSPTraceu)whereshow=renderStyle(StyleOneLineMode11).prettyPrintinstanceTraceCSPTracewhereemptyTrace=CSPTrace(Map.empty,[])runCHPAndTracep=dotv<-atomically$newTVar[]letst=CSPTraceRevtvrunCHPProgramWith'st(fliptoPublicst)pprettyPrint(CSPTrace(labels,events))=char'<'<+>sep(punctuate(char',')$evalState(mapM(liftMtext.nameEvent)events)labels)<+>char'>'labelAll(CSPTrace(labels,events))=CSPTrace(Map.empty,evalState(mapMnameEvent'events)labels)toPublic::ChannelLabelsUnique->SubTraceStore->IO(CSPTraceUnique)toPublicl(CSPTraceRevtv)=dolist<-atomically$readTVartvreturn$CSPTrace(l,concatMap(\(n,es)->concat$replicaten$reversees)$reverselist)toPublic__=error"Error in CSP trace -- tracing type got switched"-- | A helper function for pulling out the interesting bit from a CSP trace processed-- by labelAll.---- Added in version 1.5.0.getCSPPlain::CSPTraceString->[RecordedEventString]getCSPPlain(CSPTrace(ls,t))|Map.nullls=t|otherwise=error"getCSPPlain: remaining unused labels"runCHP_CSPTrace::CHPa->IO(Maybea,CSPTraceUnique)runCHP_CSPTrace=runCHPAndTracerunCHP_CSPTraceAndPrint::CHPa->IO()runCHP_CSPTraceAndPrintp=do(_,tr)<-runCHP_CSPTracepputStrLn$showtr