Skip to content

docs for Set #35

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 16, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Core__Set.res
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ type t<'a>

@send external clear: t<'a> => unit = "clear"

@send external add: (t<'a>, 'a) => t<'a> = "add"
@send external add: (t<'a>, 'a) => unit = "add"
@send external delete: (t<'a>, 'a) => bool = "delete"
@send external has: (t<'a>, 'a) => bool = "has"

Expand Down
185 changes: 185 additions & 0 deletions src/Core__Set.resi
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
/***
Bindings to the mutable JavaScript `Set`.

See [`Set`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set) on MDN.
*/

/**
Type representing an instance of `Set`.
*/
type t<'a>

/**
Creates a new, mutable JavaScript `Set`. A `Set` is a collection of unique values.

See [`Set`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set) on MDN.



## Examples
```rescript
// You can annotate the type of your set if you want to
let mySet: Set.t<string> = Set.make()

// Or you can let ReScript infer what's in your Set
let set = Set.make()
set->Set.add("Fine name") // Inferred as Set.t<string>
```

## Alternatives
A JavaScript `Set` is mutable. If you're looking for an immutable alternative, check out `Belt.Set`.
*/
@new
external make: unit => t<'a> = "Set"

/**
Turns an array of values into a Set. Meaning only unique values are preserved.

## Examples
```rescript
type languages = ReScript | JavaScript | TypeScript
let languageRank = [ReScript, JavaScript, TypeScript]

let set = Set.fromArray(languageRank) // Set.t<languages>

switch set->Set.has(ReScript) {
| true => Console.log("Yay, ReScript is in there!")
| false => Console.log("Uh-oh, something is _terribly_ wrong with this program... abort.")
}
```
*/
@new
external fromArray: array<'a> => t<'a> = "Set"

/**
Turns an iterator into a `Set`.

## Examples
```rescript
// Let's pretend we have an interator
@val external someIterator: Iterator.t<int> = "someIterator"

let set = Set.fromIterator(someIterator) // Set.t<int>
```
*/
@new
external fromIterator: Core__Iterator.t<'a> => t<'a> = "Set"

/**
Returns the size, the number of unique values, of the set.

## Examples
```rescript
let set = Set.make()

set->Set.add("someValue")
set->Set.add("someValue")
set->Set.add("someValue2")

let size = set->Set.size // 2
```
*/
@get
external size: t<'a> => int = "size"

/**
Clears all entries in the set.

## Examples
```rescript
let set = Set.make()

set->Set.add("someKey")
let size = set->Set.size // 1

set->Set.clear
let size = set->Set.size // 0
```
*/
@send
external clear: t<'a> => unit = "clear"

/**
Adds a new value to the set.

## Examples
```rescript
let set = Set.make()
set->Set.add("someValue")
```
*/
@send
external add: (t<'a>, 'a) => unit = "add"

/**
Deletes the provided `value` from the set. Returns a `bool` for whether the value existed, and was deleted.

## Examples
```rescript
let set = Set.make()
set->Set.add("someValue")
let didDeleteValue = set->Set.delete("someValue")
Console.log(didDeleteValue) // Logs `true` to the console, becuase the set had the value, so it was successfully deleted

let didDeleteValue = set->Set.delete("someNonExistantKey")
Console.log(didDeleteValue) // Logs `false` to the console, becuase the value did not exist in the set
```
*/
@send
external delete: (t<'a>, 'a) => bool = "delete"

/**
Checks whether the set has a specific value.

## Examples
```rescript
let set = Set.make()
set->Set.add("someValue")

switch set->Set.has("someValue") {
| false => Console.log("Nope, didn't have it.")
| true => Console.log("Yay, we have the value!")
}
```
*/
@send
external has: (t<'a>, 'a) => bool = "has"

/**
Iterates through all values of the set.

## Examples
```rescript
let set = Set.make()
set->Set.add("someValue")
set->Set.add("someValue2")

set->Set.forEach(value => {
Console.log(value)
})
```
*/
@send
external forEach: (t<'a>, 'a => unit) => unit = "forEach"

/**
Returns an iterator that holds all values of the set.

## Examples
```rescript
let set = Set.make()
set->Set.add("someValue")
set->Set.add("anotherValue")

let values = set->Set.values

// Logs the first value
Console.log(Iterator.next(values).value)

// You can also turn the iterator into an array.
// Remember that an iterator consumes values. We'll need a fresh values iterator to get an array of all values, since we consumed a value via `next` above already.
Console.log(set->Set.values->Iterator.toArray)
```
*/
@send
external values: t<'a> => Core__Iterator.t<'a> = "values"
6 changes: 5 additions & 1 deletion test/TempTests.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,11 @@ console.info("---");

var set = new Set();

set.add(1).add(2).delete(2);
set.add(1);

set.add(2);

set.delete(2);

console.log(set);

Expand Down
4 changes: 3 additions & 1 deletion test/TempTests.res
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,9 @@ Console.info("")
Console.info("Set")
Console.info("---")
let set = Set.make()
let _ = set->Set.add(1)->Set.add(2)->Set.delete(2)
set->Set.add(1)
set->Set.add(2)
let _ = set->Set.delete(2)
Console.log(set)

Console.info("")
Expand Down