# Chapter 4 The Edison Prelude

The `EdisonPrelude` module defines a few widely-used
utility types and classes. It is imported by every other module
in Edison, and by most clients. (It would be imported by all clients,
except that many modules re-export the relevant prelude entries.)
Currently, the `EdisonPrelude` defines two types in the
`Maybe` family, and three classes related to hashing.
data Maybe2 a b = Just2 a b | Nothing2
data Maybe3 a b c = Just3 a b c | Nothing3
class Eq a => Hash a where
hash :: a -> Int
-- forall x,y :: a. (x == y) implies (hash x == hash y)
class Hash a => UniqueHash a
-- no new methods, just a stronger invariant
-- forall x,y :: a. (x == y) iff (hash x == hash y)
class UniqueHash a => ReversibleHash a where
unhash :: Int -> a
-- forall x :: a. unhash (hash x) == x

The `Maybe2` and `Maybe3` types are used as the return types of
functions that destructure a container, returning the element (or a key and
element) together with the remaining container.
The `Hash` classes are used to build functional analogs to
traditional imperative hash tables.

This module will gradually be expanded to include utility functions
on the `Maybe2` and `Maybe3` types, and perhaps a few other
widely-used types or functions (such as `warn`).