beef331 / website

Code for the official Nim programming language website
https://nim-lang.org
18 stars 1 forks source link

Dik #22

Closed juancarlospaco closed 3 years ago

juancarlospaco commented 3 years ago

Name: Dik

Author: Juan Carlos

Posting:

Dik is a dictionary implemented as { array[char]: Option[T] }

f2539200-ae72-11eb-84df-b96fde56868a

import std/options ## For Option[T] ops.
import std/json    ## For heterogeneous values.
import dik

var myDik = {"key0": %*{"foo": 42, "bar": 3.14}, "key1": %*["baz", true]}.toDik

doAssert myDik.len == 2                        # Length
doAssert myDik.cap == 2                        # Capacity
doAssert sizeOf(myDik) == 32

doAssert myDik[1].get == %*["baz", true]       # Get by index
doAssert myDik[^1].get == %*["baz", true]      # Get by BackwardsIndex
doAssert myDik["key1"].get == %*["baz", true]  # Get by key
doAssert myDik[1..1][0].get == %*["baz", true] # Get by Slice[int]

echo myDik.pretty                              # Pretty-print
doAssert myDik.toSeq is seq[Option[JsonNode]]  # Dik to seq
doAssert "key0" in myDik                       # contains(key)
myDik.del "key1"                               # Delete an item

for (index, key, value) in myDik.enumerated:   # Iterators
  doAssert index == 0
  doAssert key == "key0"
  doAssert value.get == %*{"foo": 42, "bar": 3.14}

# Can store the lack of a value, without using "nil".
myDik["key1"] = none JsonNode
doAssert not(myDik[1].isSome)
doAssert myDik[1] == myDik["key1"]

clear myDik
doAssert myDik.len == 0
doAssert $myDik == "{:}"
ghost commented 3 years ago

interesting, but what's the actual difference vs tables?

beef331 commented 3 years ago

A major benefit is it encourage him to write doAssert sizeOf(myDik) == 32 so atleast 10 points for comedy