" I represent a workout logged against a prescription. " Class { #name : 'MFTWorkoutLog', #superclass : 'MFTObject', #instVars : [ 'prescription', 'start', 'finish', 'setGroups' ], #category : 'MyFitnessTracker-Core-Logging', #package : 'MyFitnessTracker-Core', #tag : 'Logging' } { #category : 'accessing' } MFTWorkoutLog class >> forPrescription: aMFTWorkoutPrescription [ | workoutLog | workoutLog := self new. workoutLog prescription: aMFTWorkoutPrescription. workoutLog setGroups: (aMFTWorkoutPrescription setGroups collect: [ :each | MFTSetGroupLog forPrescription: each ]). ^ workoutLog ] { #category : 'accessing' } MFTWorkoutLog >> addSetGroup: aMFTSetGroupLog [ setGroups addLast: aMFTSetGroupLog ] { #category : 'initialization' } MFTWorkoutLog >> canonicalName [ prescription ifNil: [ ^ 'no prescription' ]. ^ prescription canonicalName , ' log' ] { #category : 'as yet unclassified' } MFTWorkoutLog >> duration [ start ifNil: [ ^ Duration zero ]. finish ifNil: [ ^ DateAndTime now - start ]. ^ finish - start ] { #category : 'as yet unclassified' } MFTWorkoutLog >> exercises [ ^ self sets collect: #exercise ] { #category : 'accessing' } MFTWorkoutLog >> finish [ ^ finish ] { #category : 'accessing' } MFTWorkoutLog >> finish: aDateAndTime [ finish := aDateAndTime ] { #category : 'accessing' } MFTWorkoutLog >> finishDate: aDate [ | time | time := finish ifNotNil: [ finish asTime ] ifNil: [ start asTime ]. finish := DateAndTime date: aDate time: time ] { #category : 'accessing' } MFTWorkoutLog >> finishNow [ finish := DateAndTime now ] { #category : 'accessing' } MFTWorkoutLog >> finishTime: aTime [ | date | date := finish ifNotNil: [ finish asDate ] ifNil: [ start asDate ]. finish := DateAndTime date: date time: aTime ] { #category : 'initialization' } MFTWorkoutLog >> initialize [ super initialize. setGroups := OrderedCollection new ] { #category : 'as yet unclassified' } MFTWorkoutLog >> intensityFactor [ | weightedIntensity totalVolume | setGroups ifEmpty: [ ^ 0 ]. totalVolume := self volume. totalVolume = 0 ifTrue: [ ^ 0 ]. weightedIntensity := setGroups sum: [ :each | each intensityFactor * each volume ]. ^ (weightedIntensity / totalVolume) asFloat round: 1 ] { #category : 'testing' } MFTWorkoutLog >> isCompletelyLogged [ ^ setGroups allSatisfy: #isCompletelyLogged ] { #category : 'accessing' } MFTWorkoutLog >> prescription [ ^ prescription ] { #category : 'accessing' } MFTWorkoutLog >> prescription: aMFTWorkoutPrescription [ prescription := aMFTWorkoutPrescription ] { #category : 'accessing' } MFTWorkoutLog >> removeSetGroup: aMFTSetGroupLog [ setGroups remove: aMFTSetGroupLog ] { #category : 'accessing' } MFTWorkoutLog >> setForPrescription: aMFTSetPrescription [ ^ self sets detect: [ :set | set prescription = aMFTSetPrescription ] ifNone: [ self error: 'Unknown set prescription for this workout log.' ] ] { #category : 'initialization' } MFTWorkoutLog >> setGroups [ ^ setGroups ] { #category : 'as yet unclassified' } MFTWorkoutLog >> setGroups: aMFTSetGroupLogCollection [ setGroups := aMFTSetGroupLogCollection asOrderedCollection ] { #category : 'accessing' } MFTWorkoutLog >> setLogForPrescription: aMFTSetPrescription [ | groupLog | groupLog := self setGroupLogForPrescription: (self prescription setGroups detect: [ :eachGroup | eachGroup sets includes: aMFTSetPrescription ]). ^ groupLog setLogForPrescription: aMFTSetPrescription ] { #category : 'as yet unclassified' } MFTWorkoutLog >> sets [ ^ setGroups flatCollect: #sets ] { #category : 'accessing' } MFTWorkoutLog >> start [ ^ start ] { #category : 'accessing' } MFTWorkoutLog >> start: aDateAndTime [ start := aDateAndTime ] { #category : 'accessing' } MFTWorkoutLog >> startDate: aDate [ | time | time := start ifNotNil: [ start asTime ] ifNil: [ Time now ]. start := DateAndTime date: aDate time: time ] { #category : 'accessing' } MFTWorkoutLog >> startNow [ start := DateAndTime now ] { #category : 'accessing' } MFTWorkoutLog >> startTime: aTime [ | date | date := start ifNotNil: [ start asDate ] ifNil: [ Date today ]. start := DateAndTime date: date time: aTime ] { #category : 'accessing' } MFTWorkoutLog >> volume [ ^ setGroups sum: #volume ]