Add API: sliding and slidingSizeStep
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 20/100
- Tipo di issue
- Funzionalità
- Chiarezza
- Da chiarire
- Stato di attività
- Ferma
- Ambito
- api
Direzione di ricerca
Read the linked context in issue #212 and the discussion here to understand the proposed API alternatives. The issue asks for a decision on return types and proposes four sliding functions, but does not specify implementation locations, tests, or settled behavior. Done would require agreeing on the API and defining its behavior before implementation.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Backlinking to #212 for more context. The question here is whether to add sliding, a function that returns windows of the array, and what its type signature should be. A variation of sliding is slidingSizeStep which allows one to control the size of the window and how far to step before creating a new window. We'll cover this function later in this issue.
Starting with sliding, the core question is what the return type should be. Below, I'll refer to various ideas for implementations using _N where N refers to the possible way forward.
-- as proposed in #212
_1 :: forall a. Array a -> Array (Tuple a a)
_2 :: forall a. Array a -> Array { previous :: Maybe a, current :: a, next :: Maybe a }
_3 :: forall a b. Array a -> (Tuple a a -> b) -> Array b
_1 is what is proposed in #212. _2 is what Harry proposed in his comment, functioning more like a Zipper. _3 is something I am proposing for unifying the other two. For example, if we implemented _1 and _3 in this library, _2 could still easily be implemented via (Tuple l r) -> {previous: Nothing, current: l, next: Just r}.
Since _2's zipper-like type might want additional features (e.g. a Functor instance) that is largely outside the scope of this project, I propose not implementing it as end-users can implement it and define their own Window type. Moreover, _3 enables more potential use cases we cannot imagine right now (e.g. slidingF ((Tuple l r) -> l + r) [0, 1, 2, 3] would produce [1, 3, 5]), simulating a scanl like feature.
Let's move on to slidingSizeStep. If we ignore the size and step arguments in the function, the question arises again as to what the return type should be. Here's two factors that come to mind:
- whether the returned value is
Array _orMaybe (NonEmptyArray _) - whether the returned value is the complete subcollection or a zipper-like value
-- as proposed in #212
_11 :: forall a. Array a -> Array (NonEmptyArray a)
_12 :: forall a. Array a -> Maybe (NonEmptyArray (NonEmptyArray a))
_13 :: forall a. Array a -> Array { before :: List a, current :: a, after :: List a }
_14 :: forall a b. Array a -> (NonEmptyArray a -> b) -> Array b
I believe _11 is to be preferred over _12 because one can still get Foldable1 and friends without having to pay for the Just constructor unwrapping in _12 by doing something like this:
case NEA.fromArray $ slidingSizeStep [0, 1, 2, 3] of
Nothing -> -- returned array is empty
Just nea -> fold1 nea -- returned array is non-empty
_13 provides the same zipper-like idea. However, it cannot be implemented because arrays does not depend on lists. Working similar to sliding, _4 provides an escape hatch to this problem. One could use _4 in combination with my own arrays-zipper to get an Array-based zipper or use pointed-list to get a List-based zipper.
In conclusion, I propose we implement these four functions:
sliding :: forall a. Array a -> Array (Tuple a a)
sliding = slidingF identity
slidingF :: forall a b. (Tuple a a -> b) -> Array a -> Array b
slidingF = ...
slidingSizeStep :: forall a. Int -> Int -> Array a -> Array (NonEmptyArray a)
slidingSizeStep size step = slidingSizeStepF size step identity
slidingSizeStepF :: forall a b. Int -> Int -> (NonEmptyArray a -> b) -> Array a -> Array b
slidingSizeStepF size step f arr = ...
I'm not yet considering rangeWithStep that was also proposed in #212 because I want to first cover these two functions and their variations.
- Lingua principale
- PureScript
- Stelle
- 58
- Fork
- 70
- Merge medio
- 2g 22h
- PR unite (30g)
- 1
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Nessuna guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di purescript/purescript-arrays
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 55/100
purescript/purescript-arrays#246 ·
-
generate functionAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 35/100
purescript/purescript-arrays#244 · 2 commenti ·
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
purescript/purescript-arrays#242 · 2 commenti ·
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
purescript/purescript-arrays#241 ·
-
`groupBy` has unexpected `l` argument for `a -> a -> Boolean` predicateForse di nuovo libera Una pull request per questa issue è stata chiusa senza essere unita. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 25/100
purescript/purescript-arrays#229 · 3 commenti ·
Tutte le issue di purescript/purescript-arrays
Issue simili
-
ManageSieve proxy: a backend's NO/BYE greeting is skipped as a capability line and reported as EOFApertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno
-
Mend: dependency security vulnerability
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
ManageIQ/manageiq-pods#1476 ·
I maintainer di solito rispondono entro 1 giorno
-
mcp: typed tool handlers lose wrapped JSON-RPC errorsForse di nuovo libera Una pull request per questa issue è stata chiusa senza essere unita. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
modelcontextprotocol/go-sdk#1529 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
FinanceFlash/unvibecode#818 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100