oo-prototypes-0.1.0.0: Support for OO-like prototypes

License | GPL-2
Maintainer | yi-devel@googlegroups.com
Stability | experimental
Portability | portable
Safe Haskell | Safe-Inferred
Language | Haskell2010

Data.Prototype

Description

Support for OO-like prototypes.

Synopsis

- newtype Proto a = Proto {
  - fromProto :: a -> a
  }
- extractValue :: Proto t -> t
- override :: Proto a -> (a -> a -> a) -> Proto a
- (.->) :: Proto t -> (t -> a) -> a

# Documentation

newtype Proto a Source #

A prototype. Typically the parameter will be a record type. Fields can be defined in terms of others fields, with the idea that some of these definitons can be overridden.

Example:

    data O = O {f1, f2, f3 :: Int}
        deriving Show
    o1 = Proto $ \self -> O
      {
       f1 = 1,
       f2 = f1 self + 1,  -- 'f1 self' refers to the overriden definition of f1
       f3 = f1 self + 2
      }

Calling ``extractValue` o1` would then produce `O {f1 = 1, f2 = 2, f3 = 3}`.

Constructors

Proto |

Fields

- fromProto :: a -> a

extractValue :: Proto t -> t Source #

Get the value of a prototype. This can return bottom in case some fields are recursively defined in terms of each other.

override :: Proto a -> (a -> a -> a) -> Proto a Source #

Override a prototype. Fields can be defined in terms of their definition in the base prototype.

Example:

    o2 = o1 `override` \super self -> super
       {
       f1 = f1 super + 10,
       f3 = f3 super + 1
       }

(.->) :: Proto t -> (t -> a) -> a Source #

Field access