smart-math-0.1: Mathematical smart constructors
Safe HaskellNone
LanguageHaskell2010

Numeric.Data.Interval

Description

Provides types for enforcing minimum and maximum bounds.

Since: 0.1

Synopsis

Types

data IntervalBound Source #

Interval bound.

Since: 0.1

Constructors

Open Nat

Open bound.

Closed Nat

Closed bound.

None

No bound.

Instances

Instances details
Generic IntervalBound Source # 
Instance details

Defined in Numeric.Data.Interval.Internal

Associated Types

type Rep IntervalBound

Since: smart-math-0.1

Instance details

Defined in Numeric.Data.Interval.Internal

type Rep IntervalBound = D1 ('MetaData "IntervalBound" "Numeric.Data.Interval.Internal" "smart-math-0.1-inplace" 'False) (C1 ('MetaCons "Open" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Nat)) :+: (C1 ('MetaCons "Closed" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Nat)) :+: C1 ('MetaCons "None" 'PrefixI 'False) (U1 :: Type -> Type)))
Show IntervalBound Source #

Since: 0.1

Instance details

Defined in Numeric.Data.Interval.Internal

NFData IntervalBound Source #

Since: 0.1

Instance details

Defined in Numeric.Data.Interval.Internal

Methods

rnf :: IntervalBound -> () #

Eq IntervalBound Source #

Since: 0.1

Instance details

Defined in Numeric.Data.Interval.Internal

Ord IntervalBound Source #

Since: 0.1

Instance details

Defined in Numeric.Data.Interval.Internal

SingKind IntervalBound Source # 
Instance details

Defined in Numeric.Data.Interval.Internal

Associated Types

type Demote IntervalBound 
Instance details

Defined in Numeric.Data.Interval.Internal

SingI 'None Source # 
Instance details

Defined in Numeric.Data.Interval.Internal

Methods

sing :: Sing 'None Source #

Lift IntervalBound Source #

Since: 0.1

Instance details

Defined in Numeric.Data.Interval.Internal

Methods

lift :: Quote m => IntervalBound -> m Exp #

liftTyped :: forall (m :: Type -> Type). Quote m => IntervalBound -> Code m IntervalBound #

KnownNat k => SingI ('Closed k :: IntervalBound) Source # 
Instance details

Defined in Numeric.Data.Interval.Internal

Methods

sing :: Sing ('Closed k) Source #

KnownNat k => SingI ('Open k :: IntervalBound) Source # 
Instance details

Defined in Numeric.Data.Interval.Internal

Methods

sing :: Sing ('Open k) Source #

type Rep IntervalBound Source #

Since: 0.1

Instance details

Defined in Numeric.Data.Interval.Internal

type Rep IntervalBound = D1 ('MetaData "IntervalBound" "Numeric.Data.Interval.Internal" "smart-math-0.1-inplace" 'False) (C1 ('MetaCons "Open" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Nat)) :+: (C1 ('MetaCons "Closed" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Nat)) :+: C1 ('MetaCons "None" 'PrefixI 'False) (U1 :: Type -> Type)))
type Demote IntervalBound Source # 
Instance details

Defined in Numeric.Data.Interval.Internal

type Sing Source # 
Instance details

Defined in Numeric.Data.Interval.Internal

data Interval (l :: IntervalBound) (r :: IntervalBound) a where Source #

Represents an interval. Can be (open|closed) bounded (left|right).

Examples

Expand
>>> 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

Instances details
HasField "unInterval" (Interval l r a) a Source #

Since: 0.1

Instance details

Defined in Numeric.Data.Interval.Internal

Methods

getField :: Interval l r a -> a #

(k ~ A_Getter, a ~ n, b ~ n) => LabelOptic "unInterval" k (Interval l r a) (Interval l r a) a b Source #

Since: 0.1

Instance details

Defined in Numeric.Data.Interval.Internal

Methods

labelOptic :: Optic k NoIx (Interval l r a) (Interval l r a) a b Source #

Lift a => Lift (Interval l r a :: Type) Source #

Since: 0.1

Instance details

Defined in Numeric.Data.Interval.Internal

Methods

lift :: Quote m => Interval l r a -> m Exp #

liftTyped :: forall (m :: Type -> Type). Quote m => Interval l r a -> Code m (Interval l r a) #

MetricSpace a => MetricSpace (Interval l r a) Source #

Since: 0.1

Instance details

Defined in Numeric.Data.Interval.Internal

Methods

diffR :: Interval l r a -> Interval l r a -> Double Source #

(FromInteger a, Ord a, SingI l, SingI r, Show a) => FromInteger (Interval l r a) Source #

WARNING: Partial

Since: 0.1

Instance details

Defined in Numeric.Data.Interval.Internal

Methods

fromZ :: Integer -> Interval l r a Source #

(FromRational a, Ord a, SingI l, SingI r, Show a) => FromRational (Interval l r a) Source #

WARNING: Partial

Since: 0.1

Instance details

Defined in Numeric.Data.Interval.Internal

Methods

fromQ :: Rational -> Interval l r a Source #

(FromReal a, Ord a, SingI l, SingI r, Show a) => FromReal (Interval l r a) Source #

WARNING: Partial

Since: 0.1

Instance details

Defined in Numeric.Data.Interval.Internal

Methods

fromR :: Double -> Interval l r a Source #

ToInteger a => ToInteger (Interval l r a) Source #

Since: 0.1

Instance details

Defined in Numeric.Data.Interval.Internal

Methods

toZ :: Interval l r a -> Integer Source #

ToRational a => ToRational (Interval l r a) Source #

Since: 0.1

Instance details

Defined in Numeric.Data.Interval.Internal

Methods

toQ :: Interval l r a -> Rational Source #

ToReal a => ToReal (Interval l r a) Source #

Since: 0.1

Instance details

Defined in Numeric.Data.Interval.Internal

Methods

toR :: Interval l r a -> Double Source #

Generic (Interval l r a) Source # 
Instance details

Defined in Numeric.Data.Interval.Internal

Associated Types

type Rep (Interval l r a)

Since: smart-math-0.1

Instance details

Defined in Numeric.Data.Interval.Internal

type Rep (Interval l r a) = D1 ('MetaData "Interval" "Numeric.Data.Interval.Internal" "smart-math-0.1-inplace" 'True) (C1 ('MetaCons "UnsafeInterval" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a)))

Methods

from :: Interval l r a -> Rep (Interval l r a) x #

to :: Rep (Interval l r a) x -> Interval l r a #

(Show a, SingI l, SingI r) => Show (Interval l r a) Source #

Since: 0.1

Instance details

Defined in Numeric.Data.Interval.Internal

Methods

showsPrec :: Int -> Interval l r a -> ShowS #

show :: Interval l r a -> String #

showList :: [Interval l r a] -> ShowS #

NFData a => NFData (Interval l r a) Source #

Since: 0.1

Instance details

Defined in Numeric.Data.Interval.Internal

Methods

rnf :: Interval l r a -> () #

Eq a => Eq (Interval l r a) Source #

Since: 0.1

Instance details

Defined in Numeric.Data.Interval.Internal

Methods

(==) :: Interval l r a -> Interval l r a -> Bool #

(/=) :: Interval l r a -> Interval l r a -> Bool #

Ord a => Ord (Interval l r a) Source #

Since: 0.1

Instance details

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 #

max :: Interval l r a -> Interval l r a -> Interval l r a #

min :: Interval l r a -> Interval l r a -> Interval l r a #

(Show a, SingI l, SingI r) => Display (Interval l r a) Source #

Since: 0.1

Instance details

Defined in Numeric.Data.Interval.Internal

type Rep (Interval l r a) Source #

Since: 0.1

Instance details

Defined in Numeric.Data.Interval.Internal

type Rep (Interval l r a) = D1 ('MetaData "Interval" "Numeric.Data.Interval.Internal" "smart-math-0.1-inplace" 'True) (C1 ('MetaCons "UnsafeInterval" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a)))

Creation

mkInterval :: forall (l :: IntervalBound) (r :: IntervalBound) a. (FromInteger a, Ord a, SingI l, SingI 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

Expand
>>> 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. (FromInteger a, Lift a, Ord a, SingI l, SingI r, Show a) => a -> Code Q (Interval l r a) Source #

Template haskell for creating an Interval at compile-time.

Examples

Expand
>>> $$(mkIntervalTH @None @(Closed 100) 7)
UnsafeInterval None (Closed 100) 7

Since: 0.1

unsafeInterval :: forall (l :: IntervalBound) (r :: IntervalBound) a. (FromInteger a, HasCallStack, Ord a, SingI l, SingI 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

Expand
>>> 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

Bound aliases

These aliases allow for writing interval types more concisely.

>>> Internal.unsafeInterval @(O 10) @(C 100) 50
UnsafeInterval (Open 10) (Closed 100) 50
>>> Internal.unsafeInterval @N @(C 100) 50
UnsafeInterval None (Closed 100) 50

type O (n :: Nat) = 'Open n Source #

Alias for Open, for writing bounds more concisely.

type C (n :: Nat) = 'Closed n Source #

Alias for Closed, for writing bounds more concisely.

type N = 'None Source #

Alias for None, for writing bounds more concisely.

Optics

We provide a ReversedPrism' _MkInterval that allows for total elimination and partial construction, along with a LabelOptic Getter for #unInterval.

Examples

Expand
>>> :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. (FromInteger a, Ord a, SingI l, SingI r) => ReversedPrism' (Interval l r a) a Source #

ReversedPrism' that enables total elimination and partial construction.

Examples

Expand
>>> 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