Name: Cardinality
Synopsis: Measure container capacity. Use it to safely change container.
Description:
This module introduces typeclasses
.
* @HasCard@ = \"Has cardinality\". In other words, \"it's possible to
measure current count of elements for this container\"
.
* @HasCardT@ = \"Has cardinality (for container types of kind
@(* -> *)@)\". In other words, \"it's possible to measure
current count of elements for this container (for container types of
kind @(* -> *)@)\"
.
* @HasCardConstr@ = \"Has cardinality constraint\". In other words,
\"there is a capacity constraint for this container\".
.
* @HasCardConstrT@ = \"Has cardinality constraint (for container types
of kind @(* -> *)@)\".
In other words, \"there is a capacity constraint for this container type
of kind @(* -> *)@\".
.
* @HasCardUCT@ = \"Has cardinality-unsafe container transform\".
Define transform that may thow an error, if contents of @from@ don't
fit in @to@ .
.
* @HasCardUCT_T@ = \"Has cardinality-unsafe container
transform (for container types of kind @(* -> *)@)\".
Same thing as @HasCardUCT@, but for containers of kind @(* -> *)@.
.
No, it's not about playing cards. It's about cardinalities.
Wikipedia: \"/In mathematics, the cardinality of a set is a measure of
the number of elements of the set. For example, the set A = {2, 4, 6}
contains 3 elements, and therefore A has a cardinality of 3./\"
In this package I dare to extend the definition a bit to
\"/C. is a measure of the number of elements in a container/\"
.
Usual containers are (together with their cardinality ranges):
.
* @Identity a@ (1 element)
.
* @Maybe a@ (0..1 element)
.
* @[a]@ (0..inf elements)
.
* @Map k e@ (0..inf elements)
.
I extended this to the folowing list:
.
* @EmptySet a@ (0 elements)
.
* @Identity a@ (1 element)
.
* @Maybe a@ (0..1 element)
.
* @[a]@ (0..inf elements)
.
* @NeverEmptyList a@ (1..inf elements)
.
* @Map k e@ (0..inf elements)
.
Typeclass @HasCardUCT@ together with function @sContTrans@
(safe container transform) provides a facility to safely change
container from one to another keepeng the content. If content doesn't
fit to target container, @Nothing@ is returned. However, when
transforming from list @[a]@ to @(Maybe a)@ it won't check list length
further first 2 elements. The complexity and power of this package is
that it provides a facility to /lazily/ evaluate amount of content in
the container.
.
To interface package functions
.
@import Data.Cardinality@
Version: 0.2
Copyright: Copyright (c) 2010 Andrejs Sisojevs
License: LGPL
License-File: COPYRIGHT
Author: Andrejs Sisojevs
Maintainer: Andrejs Sisojevs
Stability: experimental
Category: Data
Tested-With: GHC == 6.10.4
Cabal-Version: >= 1.6
Build-Type: Simple
Extra-Source-Files:
COPYRIGHT
COPYING
NEWS
doinst.sh
examples/CardinalityRangeCompareTest.hs
examples/ContainerTransformsTests.hs
examples/HelloWorld.hs
Library
Build-Depends:
base >= 4 && < 5, containers, mtl
Exposed-Modules:
Data.Cardinality.Cardinality
Data.Cardinality.CardinalityRange
Data.Cardinality.ContTrans
Data.Cardinality
Data.EmptySet
Data.Intersectable
Data.NeverEmptyList
Extensions:
DeriveDataTypeable