3v4l.org

run code in 300+ PHP versions simultaneously
<?php import { Injectable, Injector } from "@angular/core"; import { InterimReviewCASections, TemplateEnum, } from "@sw/credit-review/enums/template-enum"; import { BehaviorSubject } from "rxjs"; import { ReviewContextService } from "../services/review-context.service"; import { ApprovalWorkflowStatusEnum } from "@sw/credit-review/enums/approval-workflow-status-enum"; import { RBARConstants } from "../utils/api.constant"; export enum SubStatusEnum { isGreen = 1, isOrange = 2, } @Injectable() export class ProgressTimelineService { public statuses: Record<string, any> = {}; public activeSectionIndexSource = new BehaviorSubject<number>(0); activeSectionIndex$ = this.activeSectionIndexSource.asObservable(); public statusChangeSource = new BehaviorSubject<boolean>(false); statusChanges$ = this.statusChangeSource.asObservable(); public sectionchange = new BehaviorSubject<number>(0); activeSection$ = this.sectionchange.asObservable(); constructor(private injector: Injector) {} initializeStatuses(fieldNames: string[]) { this.statuses = {}; fieldNames?.forEach(field => { this.statuses[field] = false; }); } getStatus(fieldName: string): any { return this.statuses[fieldName] || false; } updateStatus(fieldName: string, isCompleted: boolean, isException?: boolean) { if (isCompleted && !isException) { this.statuses[fieldName] = SubStatusEnum.isGreen; } else if (!isCompleted && isException === undefined) { this.statuses[fieldName] = false; } else if (isCompleted && isException) { this.statuses[fieldName] = SubStatusEnum.isOrange; } this.statusChangeSource.next(true); } updateSectionByIdFromParam( paramObj: any, parameterId: number, isCompleted: boolean, isException?: boolean ): void { if (paramObj?.parameterId == parameterId) { const paramName = paramObj?.parameterName; if (paramName) { this.updateStatus(paramName, isCompleted, isException); } } } updateActiveSectionIndex(index: number) { this.activeSectionIndexSource.next(index); } getParametersNamesStatus(sections: any[]) { const allFieldsNames = sections ?.flatMap((section: any) => section?.parameters?.map((p: any) => p.parameterName) ) .filter(Boolean); this.initializeStatuses(allFieldsNames); } updateRbarTimelineStatuses(timelineData: any[], workflowId: number): any[] { if (!timelineData) { return timelineData; } // Define status updates based on workflowId let statusUpdates = {}; if (workflowId === ApprovalWorkflowStatusEnum.Draft) { // For workflowId = 1 (Draft) statusUpdates = { 14: { completed: true, initial: false, partialCompleted: false }, 1: { completed: false, initial: false, partialCompleted: true }, }; } else if (RBARConstants.RBARASSESSMENTSTATUS.includes(workflowId)) { // For workflowId = 20, 21, 22 statusUpdates = { 14: { completed: false, initial: false, partialCompleted: true }, 1: { completed: false, initial: true, partialCompleted: false }, }; } else { return timelineData; } const updatedData = [...timelineData]; updatedData .filter( section => section.status && statusUpdates[section.reviewSectionId] ) .forEach(section => { // if (section.status.completed) { return; } Object.assign(section.status, statusUpdates[section.reviewSectionId]); }); return updatedData; } updateTranformedTimelineData( reviewSections: any[], templateId: number, activeIndex: number, updateData: (data: any[]) => void ): void { let transformedData = reviewSections?.map((section: any, index: number) => { const parametersArray: any[] = Array.isArray(section.parameters) ? [...section.parameters] : []; const filteredParameters = parametersArray ?.filter(param => { if (templateId === TemplateEnum.MarkForward) { return ( param && typeof param.parameterInputTypeId === "number" && [2, 5, 7].includes(param.parameterInputTypeId) ); } if (param.parameterId === InterimReviewCASections.MATERIAL_CHANGE) { return; } if ( templateId === TemplateEnum.Watchlist || templateId === TemplateEnum.Rbar || templateId === TemplateEnum.Interim || templateId === TemplateEnum.Standard ) { if ( templateId === TemplateEnum.Standard || templateId === TemplateEnum.Rbar ) { return ( param && (param.isMandatory === true || param?.checked === true || param.isSaved === true || param.isDefaultView === true) ); } else { return ( param && (param.isMandatory === true || param?.checked === true || param.isSaved === true) ); } } }) .map( ({ parameterId, parameterName, parameterDisplayName, parameterInputTypeId, sequence, isMandatory, timelineTick, checked, isVisible, isDefaultView, }) => ({ parameterId, parameterName, parameterDisplayName, parameterInputTypeId, sequence, isMandatory, timelineTick, checked, isVisible, isDefaultView, }) ); const completed = filteredParameters.length > 0 && filteredParameters.every(p => this.getStatus(p.parameterName)); const partial = filteredParameters.some(p => this.getStatus(p.parameterName)) && !completed; const status = { completed, partialCompleted: partial, initial: !completed && !partial, }; let isActive: boolean; if (typeof section.isActive === "boolean") { isActive = section.isActive; } else { isActive = activeIndex == section.reviewSectionId ? true : false; } return { reviewSectionId: section.reviewSectionId, reviewSectionName: section.reviewSectionName, reviewSectionDisplayName: section.reviewSectionDisplayName, status, isActive, ...(filteredParameters.length > 0 && { parameters: filteredParameters, }), }; }); if (templateId === TemplateEnum.Rbar) { const context = this.injector.get(ReviewContextService).currentContext; if (context) { transformedData.forEach(section => { if ( section.status?.completed && section.parameters?.some( (p: any) => !this.getStatus(p.parameterName) ) ) { section.status.completed = false; section.status.partialCompleted = true; } }); transformedData = this.updateRbarTimelineStatuses( transformedData, context.workFlowId ); } } updateData(transformedData); } resetStatuses() { Object.keys(this.statuses).forEach(key => { this.statuses[key] = false; }); this.statusChangeSource.next(true); this.activeSectionIndexSource.next(0); } resetTimelineData$(timelineData$: BehaviorSubject<any[]>) { this.resetStatuses(); const resetData = timelineData$.getValue()?.map((section, index) => ({ ...section, status: { completed: false, partialCompleted: false, initial: true }, isActive: index === 0, })); timelineData$.next(resetData); } updateSection(sectionId: number) { this.sectionchange.next(sectionId); } }

Here you find the average performance (time & memory) of each version. A grayed out version indicates it didn't complete successfully (based on exit-code).

VersionSystem time (s)User time (s)Memory (MiB)
8.5.00.0220.01017.18
8.4.150.0330.00819.31
8.4.140.0360.00717.71
8.4.130.0350.00717.89
8.4.120.0390.00717.89
8.4.110.0420.00317.75
8.4.100.0420.00617.58
8.4.90.0370.00717.89
8.4.80.0390.00717.66
8.4.70.0420.00917.83
8.4.60.0360.00917.60
8.4.50.0360.01017.98
8.4.40.0400.00717.43
8.4.30.0410.00817.65
8.4.20.0400.00717.45
8.4.10.0430.00517.68
8.3.280.0390.00617.95
8.3.270.0320.00917.18
8.3.260.0370.00517.18
8.3.250.0350.00917.18
8.3.240.0350.00917.18
8.3.230.0340.00917.18
8.3.220.0340.00917.18
8.3.210.0340.00917.18
8.3.200.0370.00617.18
8.3.190.0360.00717.18
8.3.180.0370.00617.18
8.3.170.0380.00717.18
8.3.160.0400.00617.18
8.3.150.0400.00717.18
8.3.140.0350.01317.18
8.3.130.0320.00817.18
8.3.120.0310.00817.18
8.3.110.0350.00517.18
8.3.100.0400.00717.18
8.3.90.0390.00817.18
8.3.80.0360.00917.18
8.3.70.0330.01317.18
8.3.60.0370.01117.18
8.3.50.0350.01017.18
8.3.40.0410.01017.88
8.3.30.0300.00717.85
8.3.20.0290.01017.97
8.3.10.0290.00817.96
8.3.00.0170.01017.79
8.2.290.0320.00817.18
8.2.280.0290.00917.18
8.2.270.0290.01017.18
8.2.260.0350.00417.18
8.2.250.0330.00617.18
8.2.240.0280.01017.18
8.2.230.0310.00617.18
8.2.220.0310.00717.18
8.2.210.0330.00517.18
8.2.200.0280.00917.18
8.2.190.0320.00717.18
8.2.180.0280.00917.18
8.2.170.0300.00817.95
8.2.160.0320.00817.95
8.2.150.0340.01017.80
8.2.140.0340.00717.31
8.2.130.0340.00717.57
8.2.120.0300.00817.83
8.2.110.0310.00917.64
8.2.100.0290.00717.75
8.2.90.0320.00817.91
8.2.80.0290.01017.77
8.2.70.0320.00717.64
8.2.60.0320.00917.61
8.2.50.0350.00617.57
8.2.40.0280.01117.58
8.2.30.0320.00517.77
8.2.20.0350.00717.51
8.2.10.0290.00717.64
8.2.00.0360.00717.73

preferences:
136.72 ms | 1083 KiB | 7 Q