úÎ!VOMz      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyNone ,=>?@DHVb#\ numhask-spaceRPos suggests where points should be placed in forming a grid across a field space. numhask-space"a space that can be divided neatly numhask-space-create equally-spaced elements across a space  numhask-space)create equally-spaced spaces from a space numhask-spaceia continuous set of numbers mathematics does not define a space, so library devs are free to experiment. la `contains` union a b && b `contains` union a b lower a \/ upper a == lower a lower a /\ upper a == upper a numhask-space#the underlying element in the space numhask-spacelower boundary numhask-spaceupper boundary numhask-space!space containing a single element numhask-spacethe intersection of two spaces numhask-spacethe union of two spaces numhask-spaceYNormalise a space so that > lower a / upper a == lower a > lower a / upper a == upper a numhask-space+create a normalised space from two elements numhask-space4create a space from two elements witjout normalising numhask-spacemid-point of the space numhask-spaceLproject a data point from one space to another, preserving relative position Qproject o n (lower o) = lower n project o n (upper o) = upper n project a a x = x numhask-space,the containing space of a non-empty Foldable numhask-spaceis an element in the space  numhask-spacedistance between boundaries! numhask-space,create a space centered on a plus or minus b" numhask-space$is a space contained within another?# numhask-spaceare two spaces disjoint?$ numhask-space'is one space completely above the other% numhask-space'is one space completely below the other& numhask-spaceFlift a monotone function (increasing or decreasing) over a given space' numhask-spacea big, big space( numhask-spacea negative space) numhask-space a small space* numhask-space widen a space+ numhask-spacewiden by a small amount,  !"#$%&'()*+,   "#$% !&'()*+337!6$7%7None +,/7=>?@ADHIVbg9I2 numhask-spaceA continuous range over type alet a = Range (-1) 1a Range -1 1fmap (+1) (Range 1 2) Range 2 3one :: Range DoubleRange -0.5 0.5zero :: Range DoubleRange Infinity -Infinityas a Field instanceRange 0 1 + zero Range 0.0 1.0Range 0 1 + Range 2 3 Range 0.0 3.0Range 1 1 - one Range 0.5 1.0Range 0 1 * one Range 0.0 1.0Range 0 1 / one Range 0.0 1.0abs (Range 1 0) Range 0.0 1.0sign (Range 1 0) == negate oneTrue IdempotentRange 0 2 + Range 0 2 Range 0.0 2.0as a space instance1NumHask.Space.project (Range 0 1) (Range 1 4) 0.52.58NumHask.Space.grid NumHask.Space.OuterPos (Range 0 10) 5[0.0,2.0,4.0,6.0,8.0,10.0]%NumHask.Space.gridSpace (Range 0 1) 4=[Range 0.0 0.25,Range 0.25 0.5,Range 0.5 0.75,Range 0.75 1.0]:gridSensible NumHask.Space.OuterPos (Range (-12.0) 23.0) 6#[-10.0,-5.0,0.0,5.0,10.0,15.0,20.0]4 numhask-space‹A tuple is the preferred concrete implementation of a Range, due to many libraries having substantial optimizations for tuples already (eg Vector[). 'Pattern Synonyms' allow us to recover a constructor without the need for tuple syntax.? numhask-space.Numeric algebra based on Interval arithmetic 1https://en.wikipedia.org/wiki/Interval_arithmeticA numhask-space!Monoid based on convex hull union23452345None /4567=>?@ADHMVbg:OVWXVWXNone,/4567=?@ADHMVbgOc numhask-spacea z of eC that form a rectangle in what is often thought of as the XY plane.let a = Rect (-1) 1 (-2) 4aRect -1 1 -2 4let (Ranges x y) = ax Range -1 1y Range -2 4fmap (+1) (Rect 1 2 3 4) Rect 2 3 4 5one :: Rect DoubleRect -0.5 0.5 -0.5 0.5zero :: Rect Double*Rect Infinity -Infinity Infinity -Infinityas a Field instanceRect 0 1 2 3 + zeroRect 0.0 1.0 2.0 3.0$Rect 0 1 (-2) (-1) + Rect 2 3 (-5) 3Rect 0.0 3.0 -5.0 3.0Rect 1 1 1 1 - oneRect 0.5 1.0 0.5 1.0Rect 0 1 0 1 * oneRect 0.0 1.0 0.0 1.0Rect 0 1 0 1 / oneRect 0.0 1.0 0.0 1.0'singleton (Pair 1.0 2.0) :: Rect DoubleRect 1.0 1.0 2.0 2.0abs (Rect 1 0 1 0)Rect 0.0 1.0 0.0 1.0!sign (Rect 1 0 1 0) == negate oneTrueas a Space instance6project (Rect 0 1 (-1) 0) (Rect 1 4 10 0) (Pair 0.5 1)Pair 2.5 -10.0$gridSpace (Rect 0 10 0 1) (Pair 2 2)W[Rect 0.0 5.0 0.0 0.5,Rect 0.0 5.0 0.5 1.0,Rect 5.0 10.0 0.0 0.5,Rect 5.0 10.0 0.5 1.0]&grid MidPos (Rect 0 10 0 1) (Pair 2 2)9[Pair 2.5 0.25,Pair 2.5 0.75,Pair 7.5 0.25,Pair 7.5 0.75]e numhask-spacepattern of Ranges xrange yrangef numhask-space+pattern of Rect lowerx upperx lowery upperyg numhask-space[create a list of pairs representing the lower left and upper right cormners of a rectangle.h numhask-space-project a Rect from an old range to a new onecdefghcdfegh{      !"#$%&'()*+,-./01234565789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXXYZ[\]^_`abcdefdghijklmnopqrstuvwxyz{|}*numhask-space-0.1.1-KhD7xYpwLfOGsUJAt0HVyONumHask.Analysis.SpaceNumHask.Data.RangeNumHask.Data.RangeDNumHask.Data.RectPosOuterPosInnerPosLowerPosUpperPosMidPos FieldSpaceGridgrid gridSpace IntersectiongetIntersectionUniongetUnionSpaceElementlowerupper singleton intersectionunionnorm...>.< Spaceablemidprojectspace1|.|memberOfwidth+/-containsdisjoint|>||<|monotonewholenegWholeepswidenwidenEps $fMonoidUnion$fSemigroupUnion$fMonoidIntersection$fSemigroupIntersection $fShowPos$fEqPosRangeRange' gridSensible$fDivisiveActionRange$fMultiplicativeActionRange$fSubtractiveActionRange$fAdditiveActionRange$fFromIntegerRange $fSignedRange$fDivisiveRange$fMultiplicativeRange$fSubtractiveRange$fAdditiveRange $fMonoidRange$fSemigroupRange$fFieldSpaceRange $fSpaceRange$fBoundedMeetSemiLatticeRange$fBoundedJoinSemiLatticeRange$fMeetSemiLatticeRange$fJoinSemiLatticeRange$fRepresentableRange$fDistributiveRange$fTraversable1Range$fTraversableRange$fFoldable1Range$fFoldableRange$fApplicativeRange $fApplyRange$fFunctorRange $fShow1Range $fEq1Range $fShowRange $fEqRange$fGenericRangeRangeD normalise$fDivisiveRangeD$fMultiplicativeRangeD$fSubtractiveRangeD$fAdditiveRangeD $fEqRangeD$fGenericRangeD $fShowRangeD$fFunctorRangeD$fFoldableRangeD$fTraversableRangeDRectRect'Rangescorners projectRect$fDivisiveActionRect$fMultiplicativeActionRect$fSubtractiveActionRect$fAdditiveActionRect$fFieldSpaceRect $fSpaceRect $fMonoidRect$fSemigroupRect$fRepresentableRect$fDistributiveRect $fShowRect$fEqRect $fFunctorRect$fApplicativeRect$fFoldableRect$fTraversableRect $fGenericRect&numhask-0.3.0.0-6WRgeQbTP4wKSUIUfjamJdNumHask.Data.PairPair