this post was submitted on 01 Sep 2023
339 points (96.2% liked)

Programming

17030 readers
246 users here now

Welcome to the main community in programming.dev! Feel free to post anything relating to programming here!

Cross posting is strongly encouraged in the instance. If you feel your post or another person's post makes sense in another community cross post into it.

Hope you enjoy the instance!

Rules

Rules

  • Follow the programming.dev instance rules
  • Keep content related to programming in some way
  • If you're posting long videos try to add in some form of tldr for those who don't want to watch videos

Wormhole

Follow the wormhole through a path of communities [email protected]



founded 1 year ago
MODERATORS
you are viewing a single comment's thread
view the rest of the comments
[–] [email protected] 2 points 1 year ago (3 children)

Honest question: is there a mapping function that handles the case where you need to loop through an iterable, and conditionally reference an item one or two steps ahead in the iterable?

[–] [email protected] 2 points 1 year ago* (last edited 1 year ago)

In Haskell, you could do something like map (\(thisItem, nextItem) -> …) (zip list (tail list))

[–] hellishharlot 2 points 1 year ago (1 children)

Not that I'm aware of but that's a condition where you're thinking with an index. What's the difference you're looking for?

[–] [email protected] 1 points 1 year ago (1 children)

Something like parsing a string that could have command codes in it of varying length. So I guess the difference is, is this a 1-, 2-, or 3-character code?

I have something like this in a barcode generator and I keep trying to find a way to make it more elegant, but I keep coming back to index and offset as the simplest and most understandable approach.

[–] hellishharlot 1 points 1 year ago

So you could generate lists of 1, 2, and 3 character code items rather than looking at index +1 or something.

[–] [email protected] 2 points 1 year ago

In js there's reduce. Something like

arr.reduce((result, currentValue, currentIndex, original) => {
if(currentIndex < original.length - 2
    && original[currentIndendex + 2] % 2 === 0 ) {
    result.push(currentValue / 2) 
} else { 
    result.push(currentValue);
}
return result;
}, []) 

This would map arr and return halved values for elements for which the element two steps ahead is even. This should be available in languages where map is present. And sorry for possible typos, writing this on mobile.