Safe Haskell | None |
---|---|
Language | Haskell2010 |
Numeric.Data.Interval
Contents
Description
Provides types for enforcing minimum and maximum bounds.
Since: 0.1
Synopsis
- data IntervalBound
- data Interval (l :: IntervalBound) (r :: IntervalBound) a where
- pattern MkInterval :: a -> Interval l r a
- mkInterval :: forall (l :: IntervalBound) (r :: IntervalBound) a. (Num a, Ord a, SingIntervalBound l, SingIntervalBound r) => a -> Maybe (Interval l r a)
- mkIntervalTH :: forall (l :: IntervalBound) (r :: IntervalBound) a. (Lift a, Num a, Ord a, SingIntervalBound l, SingIntervalBound r, Show a) => a -> Code Q (Interval l r a)
- unsafeInterval :: forall (l :: IntervalBound) (r :: IntervalBound) a. (HasCallStack, Num a, Ord a, SingIntervalBound l, SingIntervalBound r, Show a) => a -> Interval l r a
- reallyUnsafeInterval :: forall a (l :: IntervalBound) (r :: IntervalBound). a -> Interval l r a
- unInterval :: forall (l :: IntervalBound) (r :: IntervalBound) a. Interval l r a -> a
- _MkInterval :: forall (l :: IntervalBound) (r :: IntervalBound) a. (Num a, Ord a, SingIntervalBound l, SingIntervalBound r) => ReversedPrism' (Interval l r a) a
- rmatching :: (Is (ReversedOptic k) An_AffineTraversal, ReversibleOptic k) => Optic k NoIx b a t s -> s -> Either t a
- _Open :: Prism' IntervalBound Nat
- _Closed :: Prism' IntervalBound Nat
- _None :: Prism' IntervalBound ()
Types
data IntervalBound Source #
Interval bound.
Since: 0.1
Instances
data Interval (l :: IntervalBound) (r :: IntervalBound) a where Source #
Represents an interval. Can be (open|closed) bounded (left|right).
Examples
>>>
import Data.Text.Display (display)
>>>
import Data.Text qualified as T
>>>
let x = unsafeInterval @(Open 10) @(Closed 100) 50
>>>
putStrLn $ T.unpack $ display x
50 ∈ (10, 100]
>>>
let y = unsafeInterval @None @None (-2)
>>>
putStrLn $ T.unpack $ display y
-2 ∈ (-∞, ∞)
Since: 0.1
Bundled Patterns
pattern MkInterval :: a -> Interval l r a |
Instances
HasField "unInterval" (Interval l r a) a Source # | Since: 0.1 | ||||
Defined in Numeric.Data.Interval.Internal | |||||
(k ~ A_Getter, a ~ n, b ~ n) => LabelOptic "unInterval" k (Interval l r a) (Interval l r a) a b Source # | Since: 0.1 | ||||
Defined in Numeric.Data.Interval.Internal | |||||
Lift a => Lift (Interval l r a :: Type) Source # | Since: 0.1 | ||||
(Num a, Ord a, SingIntervalBound l, SingIntervalBound r, Show a) => FromInteger (Interval l r a) Source # | WARNING: Partial Since: 0.1 | ||||
Defined in Numeric.Data.Interval.Internal Methods afromInteger :: Integer -> Interval l r a Source # | |||||
(Fractional a, Ord a, SingIntervalBound l, SingIntervalBound r, Show a) => FromRational (Interval l r a) Source # | WARNING: Partial Since: 0.1 | ||||
Defined in Numeric.Data.Interval.Internal Methods afromRational :: Rational -> Interval l r a Source # | |||||
Generic (Interval l r a) Source # | |||||
Defined in Numeric.Data.Interval.Internal Associated Types
| |||||
(Show a, SingIntervalBound l, SingIntervalBound r) => Show (Interval l r a) Source # | Since: 0.1 | ||||
NFData a => NFData (Interval l r a) Source # | Since: 0.1 | ||||
Defined in Numeric.Data.Interval.Internal | |||||
Eq a => Eq (Interval l r a) Source # | Since: 0.1 | ||||
Ord a => Ord (Interval l r a) Source # | Since: 0.1 | ||||
Defined in Numeric.Data.Interval.Internal Methods compare :: Interval l r a -> Interval l r a -> Ordering # (<) :: Interval l r a -> Interval l r a -> Bool # (<=) :: Interval l r a -> Interval l r a -> Bool # (>) :: Interval l r a -> Interval l r a -> Bool # (>=) :: Interval l r a -> Interval l r a -> Bool # | |||||
(Show a, SingIntervalBound l, SingIntervalBound r) => Display (Interval l r a) Source # | Since: 0.1 | ||||
Defined in Numeric.Data.Interval.Internal | |||||
type Rep (Interval l r a) Source # | Since: 0.1 | ||||
Defined in Numeric.Data.Interval.Internal |
Creation
mkInterval :: forall (l :: IntervalBound) (r :: IntervalBound) a. (Num a, Ord a, SingIntervalBound l, SingIntervalBound r) => a -> Maybe (Interval l r a) Source #
Smart constructor for Interval
. Returns Nothing
if the given value
is not within the bounds. Note that we do not check that the bounds fit
within the type itself (e.g. consider Interval
None (Closed 200) Int8
).
Examples
>>>
mkInterval @(Open 10) @(Closed 100) 50
Just (UnsafeInterval (Open 10) (Closed 100) 50)
>>>
mkInterval @(Open 10) @(Closed 100) 100
Just (UnsafeInterval (Open 10) (Closed 100) 100)
>>>
mkInterval @(Open 10) @(Closed 100) 10
Nothing
>>>
mkInterval @(Open 10) @(Closed 100) 101
Nothing
Since: 0.1
mkIntervalTH :: forall (l :: IntervalBound) (r :: IntervalBound) a. (Lift a, Num a, Ord a, SingIntervalBound l, SingIntervalBound r, Show a) => a -> Code Q (Interval l r a) Source #
Template haskell for creating an Interval
at compile-time.
Examples
>>>
$$(mkIntervalTH @None @(Closed 100) 7)
UnsafeInterval None (Closed 100) 7
Since: 0.1
unsafeInterval :: forall (l :: IntervalBound) (r :: IntervalBound) a. (HasCallStack, Num a, Ord a, SingIntervalBound l, SingIntervalBound r, Show a) => a -> Interval l r a Source #
Variant of mkInterval
that throws an error when given a value out of bounds.
WARNING: Partial
Examples
>>>
unsafeInterval @(Open 10) @(Closed 100) 50
UnsafeInterval (Open 10) (Closed 100) 50
Since: 0.1
reallyUnsafeInterval :: forall a (l :: IntervalBound) (r :: IntervalBound). a -> Interval l r a Source #
This function is an alias for the unchecked constructor UnsafeInterval
i.e. it allows us to construct a Interval
without checking
invariants. This is intended only for when we absolutely know the invariant
holds and a branch (i.e. unsafeInterval
) is undesirable for
performance reasons. Exercise extreme caution.
Since: 0.1
Elimination
unInterval :: forall (l :: IntervalBound) (r :: IntervalBound) a. Interval l r a -> a Source #
Since: 0.1
Optics
We provide a ReversedPrism'
_MkInterval
that allows for total
elimination and partial construction, along with a LabelOptic
Getter
for #unInterval
.
Examples
>>>
:set -XOverloadedLabels
>>>
import Optics.Core (view)
>>>
let x = $$(mkIntervalTH @(Open 1) @(Open 5) 2)
>>>
view #unInterval x
2
_MkInterval :: forall (l :: IntervalBound) (r :: IntervalBound) a. (Num a, Ord a, SingIntervalBound l, SingIntervalBound r) => ReversedPrism' (Interval l r a) a Source #
ReversedPrism'
that enables total elimination and partial construction.
Examples
>>>
import Optics.Core (view)
>>>
x = $$(mkIntervalTH @(Open 1) @(Open 5) 2)
>>>
view _MkInterval x
2
>>>
rmatching (_MkInterval @(Open 1) @(Open 5)) 3
Right (UnsafeInterval (Open 1) (Open 5) 3)
>>>
rmatching (_MkInterval @(Open 1) @(Open 5)) 7
Left 7
Since: 0.1
rmatching :: (Is (ReversedOptic k) An_AffineTraversal, ReversibleOptic k) => Optic k NoIx b a t s -> s -> Either t a Source #
Reversed matching
. Useful with smart-constructor optics.
Since: 0.1
_None :: Prism' IntervalBound () Source #
Since: 0.1