overloaded-records: Overloaded Records based on current GHC proposal.

[ bsd3, data, library ] [ Propose Tags ]

Implementation of Overloaded Record Fields based on current GHC proposal. It is built on top of functionality that is included in GHC 8.0.1, but it works on older GHC versions as well. Most importantly, this library provides Template Haskell functions for automatic deriving of instancess for HasField and SetField type classes. With these instances overloaded fields can be used directly as getters and lenses.

See README for usage examples.

This implementation is highly experimental and may change rapidly.

More about the current status of OverloadedRecordFields language extension can be found on: GHC Wiki: OverloadedRecordFields.


[Skip to Readme]

Flags

Manual Flags

NameDescriptionDefault
pedantic

Pass additional warning flags to GHC.

Disabled

Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info

Downloads

Note: This package has metadata revisions in the cabal description newer than included in the tarball. To unpack the package including the revisions, use 'cabal get'.

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

Versions [RSS] 0.1.0.0, 0.2.0.0, 0.3.0.0, 0.4.0.0, 0.4.1.0, 0.4.2.0 (info)
Change log ChangeLog.md
Dependencies base (>=4.7 && <5), data-default-class (>=0.0 && <0.2), template-haskell (>=2.9 && <2.12) [details]
License BSD-3-Clause
Copyright (c) 2016, Peter Trško
Author Peter Trško
Maintainer peter.trsko@gmail.com
Revised Revision 1 made by PeterTrsko at 2016-07-17T16:18:27Z
Category Data
Home page https://github.com/trskop/overloaded-records
Bug tracker https://github.com/trskop/overloaded-records/issues
Source repo head: git clone git://github.com/trskop/overloaded-records.git
this: git clone git://github.com/trskop/overloaded-records.git(tag 0.3.0.0)
Uploaded by PeterTrsko at 2016-03-02T22:01:06Z
Distributions
Reverse Dependencies 1 direct, 0 indirect [details]
Downloads 4126 total (11 in the last 30 days)
Rating 2.0 (votes: 1) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2016-11-22 [all 1 reports]

Readme for overloaded-records-0.3.0.0

[back to package description]

Overloaded Records

Hackage Hackage Dependencies Haskell Programming Language BSD3 License

Build

Description

Implementation of Overloaded Record Fields based on current GHC proposal. It is built on top of functionality that is included in GHC 8.0.1, but it works on older GHC versions as well. Most importantly, this library provides Template Haskell functions for automatic deriving of instancess for HasField and SetField type classes. With these instances overloaded fields can be used directly as getters and lenses.

import Data.OverloadedRecords.TH (overloadedRecord)

newtype Bar a = Bar {_bar :: a}

overloadedRecord def ''Bar

On GHC 8.0.1 it is possible to just write:

{-# LANGUAGE OverloadedLabels #-}

import Control.Lens ((+~))

add :: Int -> Bar Int -> Bar Int
add n = #bar +~ n

For older GHC versions there is a family of Template Haskell functions that will derive overloaded labels in form of standard haskell definitions:

import Control.Lens ((+~))
import Data.OverloadedLabels.TH (label)

label "bar"

add :: Int -> Bar Int -> Bar Int
add n = bar +~ n

This implementation is highly experimental and may change rapidly.

More about the current status of OverloadedRecordFields language extension can be found on GHC Wiki: OverloadedRecordFields.

Usage Example

{-# LANGUAGE DataKinds #-}              -- overloadedRecord, labels
{-# LANGUAGE FlexibleContexts #-}       -- labels
{-# LANGUAGE FlexibleInstances #-}      -- overloadedRecord
{-# LANGUAGE MultiParamTypeClasses #-}  -- overloadedRecord
{-# LANGUAGE TemplateHaskell #-}        -- overloadedRecord, labels
{-# LANGUAGE TypeFamilies #-}           -- overloadedRecord
module FooBar
  where

import Data.Default.Class (Default(def))

import Data.OverloadedRecords.TH (overloadedRecord)
import Data.OverloadedLabels.TH (label, labels)


data Foo a = Foo
    { _x :: Int
    , _y :: a
    }

overloadedRecord def ''Foo
labels ["x", "y"]

newtype Bar a = Bar {_bar :: a}

overloadedRecord def ''Bar
label "bar"

License

The BSD 3-Clause License, see LICENSE file for details. This implementation is based on original prototype, which is under MIT License.

Contributions

Contributions, pull requests and bug reports are welcome! Please don't be afraid to contact author using GitHub or by e-mail.