Skip to content

Commit

Permalink
dev-haskell/data-accessor: access library to record fields, a depend …
Browse files Browse the repository at this point in the history
…of dev-haskell/idiii

Package-Manager: portage-2.3.0
  • Loading branch information
Sergei Trofimovich committed Sep 11, 2016
1 parent c072923 commit 4e200d2
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 0 deletions.
1 change: 1 addition & 0 deletions dev-haskell/data-accessor/Manifest
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
DIST data-accessor-0.2.2.7.tar.gz 9670 SHA256 3465227ad5f81059a885d354e2f3c108d550287580e6939e18350fa65e78c2ed SHA512 42f78d5be738e83e2bc64a2f38bc70748ecb741433916c4e527355f5e808a844e43b14607cfff149a5951f557c73a947469c878340738244e3778f475ccd021d WHIRLPOOL 5d9cb0eeda4d89b6e5b5e22820431b20faa9736cf539705afdd3bdc9accadec1138ff8acd33d00389755f1b803b79cfd240b13037cafdb27576478084e813ec1
26 changes: 26 additions & 0 deletions dev-haskell/data-accessor/data-accessor-0.2.2.7.ebuild
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Copyright 1999-2016 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

EAPI=5

# ebuild generated by hackport 0.4.6.9999

CABAL_FEATURES="lib profile haddock hoogle hscolour"
inherit haskell-cabal

DESCRIPTION="Utilities for accessing and manipulating fields of records"
HOMEPAGE="http://www.haskell.org/haskellwiki/Record_access"
SRC_URI="mirror://hackage/packages/archive/${PN}/${PV}/${P}.tar.gz"

LICENSE="BSD"
SLOT="0/${PV}"
KEYWORDS="~amd64 ~x86"
IUSE=""

RDEPEND=">=dev-haskell/transformers-0.2:=[profile?] <dev-haskell/transformers-0.6:=[profile?]
>=dev-lang/ghc-7.4.1:=
"
DEPEND="${RDEPEND}
>=dev-haskell/cabal-1.6
"
70 changes: 70 additions & 0 deletions dev-haskell/data-accessor/metadata.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
<pkgmetadata>
<maintainer type="project">
<email>[email protected]</email>
<name>Gentoo Haskell</name>
</maintainer>
<longdescription>
In Haskell 98 the name of a record field
is automatically also the name of a function which gets the value
of the according field.
E.g. if we have

data Pair a b = Pair
first :: a, second :: b

then

&gt; first :: Pair a b -&gt; a
&gt; second :: Pair a b -&gt; b

However for setting or modifying a field value
we need to use some syntactic sugar, which is often clumsy.

modifyFirst :: (a -&gt; a) -&gt; (Pair a b -&gt; Pair a b)
modifyFirst f r\@(Pair
first=a
) = r
first = f a

With this package you can define record field accessors
which allow setting, getting and modifying values easily.
The package clearly demonstrates the power of the functional approach:
You can combine accessors of a record and sub-records,
to make the access look like the fields of the sub-record belong to the main record.

Example:

&gt; *Data.Accessor.Example&gt; (first^:second^=10) (('b',7),"hallo")
&gt; (('b',10),"hallo")

You can easily manipulate record fields in a 'Control.Monad.State.State' monad,
you can easily code 'Show' instances that use the Accessor syntax
and you can parse binary streams into records.
See @Data.Accessor.Example@ for demonstration of all features.

It would be great if in revised Haskell versions the names of record fields
are automatically 'Data.Accessor.Accessor's
rather than plain @get@ functions.
For now, the package @data-accessor-template@ provides Template Haskell functions
for automated generation of 'Data.Acesssor.Accessor's.
See also the other @data-accessor@ packages
that provide an Accessor interface to other data types.
The package @enumset@ provides accessors to bit-packed records.

For similar packages see @lenses@ and @fclabel@.
A related concept are editors
&lt;http://conal.net/blog/posts/semantic-editor-combinators/&gt;.
Editors only consist of a modify method
(and @modify@ applied to a 'const' function is a @set@ function).
This way, they can modify all function values of a function at once,
whereas an accessor can only change a single function value,
say, it can change @f 0 = 1@ to @f 0 = 2@.
This way, editors can even change the type of a record or a function.
An Arrow instance can be defined for editors,
but for accessors only a Category instance is possible ('(.)' method).
The reason is the @arr@ method of the @Arrow@ class,
that conflicts with the two-way nature (set and get) of accessors.
</longdescription>
</pkgmetadata>

0 comments on commit 4e200d2

Please sign in to comment.