Re: [Pharo-users] Why no collect:ifNone: ?
You can learn so much from these innocent questions Maximiliano pointed out that there is a difference between #sum and a method I never noticed #sumNumbers, the latter would avoided my problem too... Sent from my iPhone > On 30 Apr 2018, at 23:00, Tim Mackinnonwrote: > > Yep - as I was reading the replies from you and Esteban - I was thinking > there was something odd, and its correct, I’ve been careless - the > problematic code had a trailing #sum to it, which is actually where the > problem was…. > > total := schedule ifEmpty: [ 0 ] ifNotEmpty: [ :c | >(c collect: [ :r | ((DateAndTime fromString: r end) - (DateAndTime > fromString: r start)) asHours ]) sum ]. > > So you are both correct - it should have used inject. > > total := schedule inject: 0 into: [ :result :item | result + ((DateAndTime > fromString: item end) - (DateAndTime fromString: item start)) asHours ]. > > Oops - thanks for being my sound board. > > Tim > >> On 30 Apr 2018, at 22:02, Francisco Garau wrote: >> >> >> Have you tried #inject:into: ? Looks like what are needing here >> >> - Francisco >> >> >>> On 30 Apr 2018, at 19:37, Tim Mackinnon wrote: >>> >>> >>> Hi - I hit a small bug in my lunch experiments with Willow where I wanted >>> to sum up a collection of support hours. >>> >>> I was collect: in the hours worked and hadn’t accounted for an empty >>> collection. >>> >>> When I went to do it I was surprised there isn’t a concept of >>> #collect:ifNone: that mirrors something like at:ifAbsent: or the nicely >>> readable collect:thenXxx: methods. >>> >>> Why is this? >>> >>> I’m curious about style - and the elegance of my workaround : >>> >>> result ifEmpty: [ 0 ] ifNotEmpty:[ :r | r collect: [:I | i hours ]] >>> >>> which is ok, but seems a mouthful? >>> >>> Am I missing a trick? >>> >>> Tim >>> >>> Sent from my iPhone >>> > >
Re: [Pharo-users] Why no collect:ifNone: ?
Yep - as I was reading the replies from you and Esteban - I was thinking there was something odd, and its correct, I’ve been careless - the problematic code had a trailing #sum to it, which is actually where the problem was…. total := schedule ifEmpty: [ 0 ] ifNotEmpty: [ :c | (c collect: [ :r | ((DateAndTime fromString: r end) - (DateAndTime fromString: r start)) asHours ]) sum ]. So you are both correct - it should have used inject. total := schedule inject: 0 into: [ :result :item | result + ((DateAndTime fromString: item end) - (DateAndTime fromString: item start)) asHours ]. Oops - thanks for being my sound board. Tim > On 30 Apr 2018, at 22:02, Francisco Garauwrote: > > > Have you tried #inject:into: ? Looks like what are needing here > > - Francisco > > >> On 30 Apr 2018, at 19:37, Tim Mackinnon wrote: >> >> >> Hi - I hit a small bug in my lunch experiments with Willow where I wanted to >> sum up a collection of support hours. >> >> I was collect: in the hours worked and hadn’t accounted for an empty >> collection. >> >> When I went to do it I was surprised there isn’t a concept of >> #collect:ifNone: that mirrors something like at:ifAbsent: or the nicely >> readable collect:thenXxx: methods. >> >> Why is this? >> >> I’m curious about style - and the elegance of my workaround : >> >> result ifEmpty: [ 0 ] ifNotEmpty:[ :r | r collect: [:I | i hours ]] >> >> which is ok, but seems a mouthful? >> >> Am I missing a trick? >> >> Tim >> >> Sent from my iPhone >>
Re: [Pharo-users] Why no collect:ifNone: ?
Hi Tim, What I found confusing there is that with #select:thenCollect: or #collect:thenXxx: you're always dealing with collections. In your #collect:ifNone: there is a mix. You can return a collection (#collect:) or the result of evaluating the emptyBlock, which in your example is a number, so I it seems like a semantic mismatch smell to me. Following your example: myVar := result ifEmpty: [ 0 ] ifNotEmpty:[ :r | r collect: [:I | i hours ]]. What will be in myVar? a collection? a number? something else?. Maybe your example is too abstract to give a good feedback. Regards, On 30/04/2018 15:37, Tim Mackinnon wrote: > > Hi - I hit a small bug in my lunch experiments with Willow where I wanted to > sum up a collection of support hours. > > I was collect: in the hours worked and hadn’t accounted for an empty > collection. > > When I went to do it I was surprised there isn’t a concept of > #collect:ifNone: that mirrors something like at:ifAbsent: or the nicely > readable collect:thenXxx: methods. > > Why is this? > > I’m curious about style - and the elegance of my workaround : > > result ifEmpty: [ 0 ] ifNotEmpty:[ :r | r collect: [:I | i hours ]] > > which is ok, but seems a mouthful? > > Am I missing a trick? > > Tim > > Sent from my iPhone > -- Esteban A. Maringolo
[Pharo-users] Why no collect:ifNone: ?
Hi - I hit a small bug in my lunch experiments with Willow where I wanted to sum up a collection of support hours. I was collect: in the hours worked and hadn’t accounted for an empty collection. When I went to do it I was surprised there isn’t a concept of #collect:ifNone: that mirrors something like at:ifAbsent: or the nicely readable collect:thenXxx: methods. Why is this? I’m curious about style - and the elegance of my workaround : result ifEmpty: [ 0 ] ifNotEmpty:[ :r | r collect: [:I | i hours ]] which is ok, but seems a mouthful? Am I missing a trick? Tim Sent from my iPhone