Provide a way to define tuple sucseccsion types
- Lingua principale
- Rust
- Stelle
- 22.3k
- Fork
- 1.9k
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Descrizione
There are some instances where it would be really useful to have a way to define a succession type for an existing tuple. I presumed something like this would work, but unfortunately it does not:
```js
type Prepend = [first, ...rest]
```
Here an example where something like this is necessary:
```js
type State = {
chunks Array,
parsed: values
}
interface Parser {
parse(state: State): Array>
}
class VariableParser implements Parser {
read: string => ?b
name: string
constructor(name: string, read: string => ?b) {
this.name = name
this.read = read
}
parse({ chunks, parsed }: State): Array> {
if (chunks.length === 0) {
return []
} else {
const [first, ...rest] = chunks
const value = this.read(first)
if (value != null) {
return [
{
chunks: rest,
parsed: [value, ...parsed]
}
]
} else {
return []
}
}
}
}
```
Right now only option to do something along those lines requires either usage of trees: so instead of `Parser` -> `Parser` or functions `Parser b>` but both options lead to unpleasant interfaces to use and really confusing error messages. Here is a [complete example to illustrate](https://flow.org/try/#0PQKgBAAgZgNg9gdzCYAoVBTAHgBzgJwBcxCBPHDMAZUIENCMAeAN1pgFcMA+MAXjADeqMGADOGAOYBbDADtCogFxgAgvny1SjUYXwBLWRK4AaYWBy184gCbLWHDKgC+6bHiJgDDfFFoBjSgAFS3F8RlpjMAAjHiERCysMAAodegxlGjTwrgBKZTUNLUyGRhiTM3FpOUIk2VoZZR19QzywYMSwiOjykT8AC1oDRj8uJNoob2V20NLIkdbpjE65rmd0PxhaUVE2kKWVQIBJcMiYzykcGAwZeR3F5e7BMwBqBPFlFLoGDK+mWly+DwCppGMUmGUKpIbjU6g0xLoDBIFnsHmc4iIwPgMIR2PhZCQ+npRAA6fqDWS1DBIKhQ6r3Wr1DA5HJmFy9AZDEZjCZLKYo2ZgeZ8jonQWxMwiLE4vFgWRUsAAYQ5cus9MIhNEkXG3hZIhcLlQGy2OxpVXk92yYGwDFk1juKIOxy6-yeIgYWEIjQRhjMfjgsia7D8hAISXdnvhzSRroxonYFHwSV1GPVROJ4b4JGtrLMb2SAnMe2skUq0J2Th+WX+rWBRV+2XFGMF-p0gizHrATkzqdEEs8UDAKVpt2JV0M6r4vH4AAYcjGm1LcfiANoAXT7XYwMHE84xfoDxGXUD0VkIkWJF6xOlXmdL1V7TZEegHSWPp8n-HDc-Rj8x2KXYDLgWd63MoV5noWiTWJ266-pu26UD+j6LjKa59nqG45gaRrbGAACqsh6P6FpdGc1pyHauwdI6opormKJKFRMykVwaG9C2uhBiGiZ5lYwrMacrGrt+fZxgmSZ9j2xK8Ts-AyTm8R7J8aSViU1b5OoIJgqUXCNhiKH4rA9BSLQOBJLxgKQaE0lKakDA5JEUkycm+rrJsuEAGqWHotBRFcJGCVaHoUfa1FHKKy5RFqq56VitC2JGiKWQA-FEZiwukiU+uxB74FxoYZV6UaRHFCVNElvA8KlIlNmJSwSU2UkZZmGWSRqxKlZmpUKVZ+ZiMOCiRHm0EVtQ9bqaoml1lkkXRbpu7PoOIEKKOcgSBOU4zjVyH-qhsEYvBO5ITlrbLnKHrnpeGDXreA0Po++6tv07CyAA1t27WlZSHrJk2i1JM9b1gAAhPwsjsDAMDbb+BmAehj7Hb+-VmgoYHXWe8O-sNyjLoDr1DUW+1I52mNgETB1Wghu4LrtK7kxhTZsiT2HuTsSrkhgqr8qRKxBTalH3DRXQjDGUQYFABCZQF3RmNqvJMUsAojL6HF5cGoZixLWL8YrLFajy+A62EUVitDYjxvVv0EmmmuS5mttYm1aZy-gmYuz1ebKd8Y1VrkGmFKC9YjHpJ3EAWDsYPr3idh9RJ9rDRmECZZle5l2kxHOlVgC7NmJKnDnROLku5+I+cuWsmC4AQxCPTXyqZrRKxJGYEdG7RPTZwbbcm8ryIisLPBZ3KSDswYnP0hHUdLCylfuDXHFgKw+i+VcDcsc3IiFVlEimJKGDxUVFVVWlfcCYBJu0DFlnD2AXnL35GD0hlJX79YM9uNXzYHsj0Jr6M4aHxaG3Z0g9Vib3lKaaEaprTvyrh4Wu28-4MjhOVQwmYABEqCJDoNPrrSIy4sFzUBGYJePkH7IMjp4aw1Q9BkFgXPL+rYvCSCWEgreWCMGHHkCw-AODgH4PBlIMW+AiGVRId5FeyRn5-nilwhgEhp7rAXqVORPDMxJAMDgdgEYsGtGSoI4Rll0QIPsJwTMeYABi8B6AaNkFowgyZ-oADl2BCKWMSIkqiFGJlMUyM2sNfGskpkdeOtNZQQxgFhJR39E7JzXoJV8HxNHaOULQTOQIpo6S1FNf2IIJq1h0sQkQa5ST+j8DYi8xJLCFGJMnV8zJolMOofIWhpAkG+NSa0WgllAmz0-ggvMSD6IdDbuDSGWoO64hgIAnewz6iMQLMuV6GBSAzNXDMkmejulZ2MQvUhtBbjmJRCXPqy1GKiEuLQvCAAlAAMkkKZBdsbhMhp2ZMsM8wAAktxmX2bcFk2EF5fJ+Uguy11cnTTUrpLZRizD-TBSSMc60+gfjALOXcsMxmRL1MExCfYEEEN+JdDq6Mbz8ARX2eFvxiRnNWuOFFm00Vmz3tKfEYKTnWA3Li-sS1qW0qRRtKcYAACMYAABkYr4RpBpXdZc04yVCvQTg6mf5WVSoYByrlW4QkwzCcCmAZlwJWyZq5Pp8CF4XJgFcu56ipkzNaFgtcsLQ4-3vJmKZNLLk1HQcAHBcKXz8rWhOHg05xWSrOXKhV-AlX+LCbS0QVqAhJGFS5blSFYZnKiagMgFAFaWn4BaEAEz0DMJ8P4IIewVA7HRKKOA2jRi8R1owZcXQsUxUiGMdJYA60QTtdvPRPbd5gEbt2+t5kURNtmoBVtETVztsHKRLtg6wB9t0coZKg6zAjr8JEHtow+yNrzbjfBJsW2RDbXOjuIgxinDmEu7RQ6RCru9BIMwA6H1bp5oKSIxZR2EH3U2Q9ixm2-uPeffBM7IZzsvY+hdt7v1gDfpZTdTZn1RjfeulDw6v07sQ5EShe6N4YiA3sZtlDlygdw1Os9LyYDQZg32G90Q5g-vw-ejGqH8DTO3hhsAG6P0iG3axq0kQoC7rHQeidR6xOAXI5Rk9EHz2zvo+2xjOHhOUKgOx2DaHES8f4xx7D8HcO-s05EHef6APEak8B5cFmjz4Lk-gqjp7IN0ZU6ppsTGe4adE+Z7TfZdPZTAO+wzQm8MibADJizfRxP-qI4pEZR7YuAXszJ5cTnAIucU7RjzDGvPqYi2ZsAMWAuce41g-TPaK4DMrYxRYVb1Hhd-dFyIKXCPDNCEOkMXkHBDqC6+0LzrGHEGsPQbZvVx0dEiFMyIAgnCOJfGNugIMwYRLNggywEhZKAXJlcYg4FMzLdoH2BAhJV5JEO6DWjzKRuAT6K-Rygw6NdXRvDQ7n5nvwy2ySF6ohCQTCSA9+KxrQlqp62wTgSRKk-dTdqvFNM1VYqwqk2QpAWTADQIaBeUyMHAHYKEYAUQ4BRGAH6KQZZgAABYABM6DsffwJ0sBUcAKd0hRLdFGSR0FM94cmUkypPhRm5xlHB-Plrc-J2WP1IgBfklsfI+q6C9DWDF+gPMVaHmhBZ2z80KIO3sJfZEFXygDHT0skkAs0iVdvJm1xmeGvRBa+Z6zqB+vByG+KlQ+1FureMmNyNAujzUBAA) this case, here is a tiny summary:
```js
const url = "/user/bob/comments/42"
const userCommentParser = segment("user")
.chain(string("name"))
.segment("comments")
.chain(integer("id"))
parseAs(userCommentParser, (name: string, id: number) => ({ name, id }), url)
parseAs(userCommentParser, (name: string, id: string) => ({ name, id }), url) // <- fails due to type mismatch for `id` argument
```
```
230: parseAs(userCommentParser, (name: string, id: string) => ({ name, id }), url)
^ function call. Function cannot be called on any member of intersection type
167: (parser: Parse<[a, null]>, (a) => out, url: string): ?out,
^ intersection
```
Guida per i contributori
Apri la guida per i contributori
Valutazione
Questa issue non è ancora stata valutata.