nikita-volkov/typeclasses/1.6.0

NOTE: the latest version is 1.8.0

Rerouted (retagged, needs approval). The tag now points at a different commit than when this version was published. The Lamdera package server serves a copy recovered from https://github.com/nikita-volkov/typeclasses.

What we checked: Tag 1.6.0 is still on github.com/nikita-volkov/typeclasses; its commit 9a34425b67b5 is from 2019-07-25 15:07 UTC, after the version was published (2019-07-25 15:07 UTC); elm.json is byte-identical to package.elm-lang.org's; the exposed modules match docs.json; the zip's SHA-1 is not the published one and nothing else confirms its contents.

We could not verify this copy against what was published, so the Lamdera compiler asks before using it (y/n). Without a terminal, as in CI, it stops with an error unless approved:

  • lamdera make --auto-approve-package-rerouting approves rerouted versions for that run,
  • LAMDERA_AUTO_APPROVE_PACKAGE_REROUTING=1 does the same for every run in that environment,
  • LAMDERA_CACHE=off skips the Lamdera package server altogether: packages come from package.elm-lang.org and GitHub only, as with elm, and a rerouted version then fails to download.

Details · package.elm-lang.org's zip: https://github.com/nikita-volkov/typeclasses/zipball/1.6.0/

Typeclasses.Classes.Hashing

Hashing typeclass definition and its instances for basic types. Implements fast non-cryptographic hashing for arbitrary types, suitable for implementing generic hashing-based datastructures, like hash-tables and hash-sets.

Much inspired by the "hashable" Haskell library.

Definition

type alias Hashing a =
{ hash : a -> Int
, hashWithSalt : Int -> a -> Int
}

Explicit typeclass which implements hashing for type a.

Construction utilities

hash : (a -> Int) -> Hashing a

Construct from just the hashing function.

hashWithSalt : (Int -> a -> Int) -> Hashing a

Construct from just the hashing function, which combines the hash with salt.

Instance transformation utilities

map : (b -> a) -> Hashing a -> Hashing b

Map over the owner type of an instance to produce a new instance.

Please notice that mapping is contravariant (i.e., (b -> a) instead of (a -> b)).

concat : List (Hashing a) -> Hashing a

Compose multiple instances together.

Allows to create instances for product types (records). E.g.,

type alias Person = { name : String, age : Int }

hashing : Hashing Person
hashing =
  Hashing.concat
    [
      Hashing.map .name (Hashing.string 4),
      Hashing.map .age Hashing.int
    ]

Instances

bool : Hashing Bool

Instance for Bool.

int : Hashing Int

Instance for Int.

float : Hashing Float

Instance for Float.

char : Hashing Char

Instance for Char.

string : Int -> Hashing String

Hashing instance for strings, determined by sampling. Sampling determines the maximum amount of characters to be picked from the string while constructing the hash, allowing you to control the balance between the quality of hashing and its performance.

maybe : Hashing a -> Hashing (Maybe a)

Instance for Maybe, which utilizes an instance for its element.

list : Hashing a -> Hashing (List a)

Instance for List, which utilizes an instance for its element. Traverses the list in whole.

array : Hashing a -> Int -> Hashing (Array a)

Hashing instance for arrays, determined by the Hashing instance for elements and sampling. Sampling determines the maximum amount of elements to be picked from the array while constructing the hash, allowing you to control the balance between the quality of hashing and its performance.