Ranged-sets-0.1.0: Doc/Data-Ranged-Ranges.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--Rendered using the Haskell Html Library v0.2-->
<HTML
><HEAD
><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8"
><TITLE
>Data.Ranged.Ranges</TITLE
><LINK HREF="haddock.css" REL="stylesheet" TYPE="text/css"
><SCRIPT SRC="haddock.js" TYPE="text/javascript"
></SCRIPT
></HEAD
><BODY
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="topbar"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD
><IMG SRC="haskell_icon.gif" WIDTH="16" HEIGHT="16" ALT=" "
></TD
><TD CLASS="title"
></TD
><TD CLASS="topbut"
><A HREF="index.html"
>Contents</A
></TD
><TD CLASS="topbut"
><A HREF="doc-index.html"
>Index</A
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="modulebar"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD
><FONT SIZE="6"
>Data.Ranged.Ranges</FONT
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="section4"
><B
>Contents</B
></TD
></TR
><TR
><TD
><DL
><DT
><A HREF="#1"
>Construction
</A
></DT
><DT
><A HREF="#2"
>Predicates
</A
></DT
><DT
><A HREF="#3"
>Membership
</A
></DT
><DT
><A HREF="#4"
>Set Operations
</A
></DT
><DT
><A HREF="#5"
>QuickCheck properties
</A
></DT
></DL
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
>Description</TD
></TR
><TR
><TD CLASS="doc"
>A range has an upper and lower boundary.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section1"
>Synopsis</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
> <A HREF="#t%3ARange"
>Range</A
> v = <A HREF="#v%3ARange"
>Range</A
> {<TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="recfield"
><A HREF="#v%3ArangeLower"
>rangeLower</A
>, <A HREF="#v%3ArangeUpper"
>rangeUpper</A
> :: (<A HREF="Data-Ranged-Boundaries.html#t%3ABoundary"
>Boundary</A
> v)</TD
></TR
></TABLE
>}</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AemptyRange"
>emptyRange</A
> :: <A HREF="Data-Ranged-Boundaries.html#t%3ADiscreteOrdered"
>DiscreteOrdered</A
> v => <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AfullRange"
>fullRange</A
> :: <A HREF="Data-Ranged-Boundaries.html#t%3ADiscreteOrdered"
>DiscreteOrdered</A
> v => <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3ArangeIsEmpty"
>rangeIsEmpty</A
> :: <A HREF="Data-Ranged-Boundaries.html#t%3ADiscreteOrdered"
>DiscreteOrdered</A
> v => <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v -> Bool</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3ArangeOverlap"
>rangeOverlap</A
> :: <A HREF="Data-Ranged-Boundaries.html#t%3ADiscreteOrdered"
>DiscreteOrdered</A
> v => <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v -> <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v -> Bool</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3ArangeEncloses"
>rangeEncloses</A
> :: <A HREF="Data-Ranged-Boundaries.html#t%3ADiscreteOrdered"
>DiscreteOrdered</A
> v => <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v -> <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v -> Bool</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3ArangeSingletonValue"
>rangeSingletonValue</A
> :: <A HREF="Data-Ranged-Boundaries.html#t%3ADiscreteOrdered"
>DiscreteOrdered</A
> v => <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v -> Maybe v</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3ArangeHas"
>rangeHas</A
> :: Ord v => <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v -> v -> Bool</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3ArangeListHas"
>rangeListHas</A
> :: Ord v => [<A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v] -> v -> Bool</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3AsingletonRange"
>singletonRange</A
> :: <A HREF="Data-Ranged-Boundaries.html#t%3ADiscreteOrdered"
>DiscreteOrdered</A
> v => v -> <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3ArangeIntersection"
>rangeIntersection</A
> :: <A HREF="Data-Ranged-Boundaries.html#t%3ADiscreteOrdered"
>DiscreteOrdered</A
> v => <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v -> <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v -> <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3ArangeUnion"
>rangeUnion</A
> :: <A HREF="Data-Ranged-Boundaries.html#t%3ADiscreteOrdered"
>DiscreteOrdered</A
> v => <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v -> <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v -> [<A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v]</TD
></TR
><TR
><TD CLASS="s8"
></TD
></TR
><TR
><TD CLASS="decl"
><A HREF="#v%3ArangeDifference"
>rangeDifference</A
> :: <A HREF="Data-Ranged-Boundaries.html#t%3ADiscreteOrdered"
>DiscreteOrdered</A
> v => <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v -> <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v -> [<A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v]</TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section2"
><A NAME="1"
>Construction
</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><SPAN CLASS="keyword"
>data</SPAN
> <A NAME="t%3ARange"
></A
><B
>Range</B
> v</TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0"
><TR
><TD CLASS="ndoc"
>A Range has upper and lower boundaries.
</TD
></TR
><TR
><TD CLASS="section4"
>Constructors</TD
></TR
><TR
><TD CLASS="body"
><TABLE CLASS="vanilla" CELLSPACING="5" CELLPADDING="0"
><TR
><TD CLASS="arg"
><A NAME="v%3ARange"
></A
><B
>Range</B
></TD
><TD CLASS="rdoc"
></TD
></TR
><TR
><TD CLASS="body" COLSPAN="2"
><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0"
><TR
><TD CLASS="arg"
><A NAME="v%3ArangeLower"
></A
><B
>rangeLower</B
>, <A NAME="v%3ArangeUpper"
></A
><B
>rangeUpper</B
> :: (<A HREF="Data-Ranged-Boundaries.html#t%3ABoundary"
>Boundary</A
> v)</TD
><TD CLASS="rdoc"
></TD
></TR
></TABLE
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="section4"
><IMG SRC="minus.gif" CLASS="coll" ONCLICK="toggle(this,'i:Range')" ALT="show/hide"
> Instances</TD
></TR
><TR
><TD CLASS="body"
><DIV ID="i:Range" STYLE="display:block;"
><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0"
><TR
><TD CLASS="decl"
>(Arbitrary v, <A HREF="Data-Ranged-Boundaries.html#t%3ADiscreteOrdered"
>DiscreteOrdered</A
> v, Show v) => Arbitrary (<A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v)</TD
></TR
><TR
><TD CLASS="decl"
><A HREF="Data-Ranged-Boundaries.html#t%3ADiscreteOrdered"
>DiscreteOrdered</A
> a => Eq (<A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> a)</TD
></TR
><TR
><TD CLASS="decl"
><A HREF="Data-Ranged-Boundaries.html#t%3ADiscreteOrdered"
>DiscreteOrdered</A
> a => Ord (<A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> a)</TD
></TR
><TR
><TD CLASS="decl"
>(Show a, <A HREF="Data-Ranged-Boundaries.html#t%3ADiscreteOrdered"
>DiscreteOrdered</A
> a) => Show (<A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> a)</TD
></TR
></TABLE
></DIV
></TD
></TR
></TABLE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3AemptyRange"
></A
><B
>emptyRange</B
> :: <A HREF="Data-Ranged-Boundaries.html#t%3ADiscreteOrdered"
>DiscreteOrdered</A
> v => <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v</TD
></TR
><TR
><TD CLASS="doc"
>The empty range
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3AfullRange"
></A
><B
>fullRange</B
> :: <A HREF="Data-Ranged-Boundaries.html#t%3ADiscreteOrdered"
>DiscreteOrdered</A
> v => <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v</TD
></TR
><TR
><TD CLASS="doc"
>The full range. All values are within it.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section2"
><A NAME="2"
>Predicates
</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3ArangeIsEmpty"
></A
><B
>rangeIsEmpty</B
> :: <A HREF="Data-Ranged-Boundaries.html#t%3ADiscreteOrdered"
>DiscreteOrdered</A
> v => <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v -> Bool</TD
></TR
><TR
><TD CLASS="doc"
>A range is empty unless its upper boundary is greater than its lower
boundary.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3ArangeOverlap"
></A
><B
>rangeOverlap</B
> :: <A HREF="Data-Ranged-Boundaries.html#t%3ADiscreteOrdered"
>DiscreteOrdered</A
> v => <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v -> <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v -> Bool</TD
></TR
><TR
><TD CLASS="doc"
>Two ranges overlap if their intersection is non-empty.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3ArangeEncloses"
></A
><B
>rangeEncloses</B
> :: <A HREF="Data-Ranged-Boundaries.html#t%3ADiscreteOrdered"
>DiscreteOrdered</A
> v => <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v -> <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v -> Bool</TD
></TR
><TR
><TD CLASS="doc"
>The first range encloses the second if every value in the second range is
also within the first range. If the second range is empty then this is
always true.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3ArangeSingletonValue"
></A
><B
>rangeSingletonValue</B
> :: <A HREF="Data-Ranged-Boundaries.html#t%3ADiscreteOrdered"
>DiscreteOrdered</A
> v => <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v -> Maybe v</TD
></TR
><TR
><TD CLASS="doc"
>If the range is a singleton, returns <TT
>Just</TT
> the value. Otherwise returns
<TT
>Nothing</TT
>.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section2"
><A NAME="3"
>Membership
</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3ArangeHas"
></A
><B
>rangeHas</B
> :: Ord v => <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v -> v -> Bool</TD
></TR
><TR
><TD CLASS="doc"
>True if the value is within the range.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3ArangeListHas"
></A
><B
>rangeListHas</B
> :: Ord v => [<A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v] -> v -> Bool</TD
></TR
><TR
><TD CLASS="doc"
>True if the value is within one of the ranges.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section2"
><A NAME="4"
>Set Operations
</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3AsingletonRange"
></A
><B
>singletonRange</B
> :: <A HREF="Data-Ranged-Boundaries.html#t%3ADiscreteOrdered"
>DiscreteOrdered</A
> v => v -> <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v</TD
></TR
><TR
><TD CLASS="doc"
>A range containing a single value
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3ArangeIntersection"
></A
><B
>rangeIntersection</B
> :: <A HREF="Data-Ranged-Boundaries.html#t%3ADiscreteOrdered"
>DiscreteOrdered</A
> v => <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v -> <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v -> <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v</TD
></TR
><TR
><TD CLASS="doc"
>Intersection of two ranges, if any.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3ArangeUnion"
></A
><B
>rangeUnion</B
> :: <A HREF="Data-Ranged-Boundaries.html#t%3ADiscreteOrdered"
>DiscreteOrdered</A
> v => <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v -> <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v -> [<A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v]</TD
></TR
><TR
><TD CLASS="doc"
><P
>Union of two ranges. Returns one or two results.
</P
><P
>If there are two results then they are guaranteed to have a non-empty
gap in between, but may not be in ascending order.
</P
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="decl"
><A NAME="v%3ArangeDifference"
></A
><B
>rangeDifference</B
> :: <A HREF="Data-Ranged-Boundaries.html#t%3ADiscreteOrdered"
>DiscreteOrdered</A
> v => <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v -> <A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v -> [<A HREF="Data-Ranged-Ranges.html#t%3ARange"
>Range</A
> v]</TD
></TR
><TR
><TD CLASS="doc"
><TT
>range1</TT
> minus <TT
>range2</TT
>. Returns zero, one or two results. Multiple
results are guaranteed to have non-empty gaps in between, but may not be in
ascending order.
</TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="section2"
><A NAME="5"
>QuickCheck properties
</A
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="doc"
><P
>Range union
</P
><PRE
> prop_union r1 r2 n =
(r1 `rangeHas` n || r2 `rangeHas` n)
== (r1 `rangeUnion` r2) `rangeListHas` n
</PRE
><P
>Range intersection
</P
><PRE
> prop_intersection r1 r2 n =
(r1 `rangeHas` n && r2 `rangeHas` n)
== (r1 `rangeIntersection` r2) `rangeHas` n
</PRE
><P
>Range difference
</P
><PRE
> prop_difference r1 r2 n =
(r1 `rangeHas` n && not (r2 `rangeHas` n))
== (r1 `rangeDifference` r2) `rangeListHas` n
</PRE
><P
>Singleton range
</P
><PRE
> prop_singletonHas v =
singletonRange v `rangeHas` v
</PRE
><PRE
> prop_singletonConverse v =
rangeSingletonValue (singletonRange v) == Just v
</PRE
></TD
></TR
><TR
><TD CLASS="s15"
></TD
></TR
><TR
><TD CLASS="botbar"
>Produced by <A HREF="http://www.haskell.org/haddock/"
>Haddock</A
> version 0.8</TD
></TR
></TABLE
></BODY
></HTML
>