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

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 #

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

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) #

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

WARNING: Partial

Since: 0.1

Instance details

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

Instance details

Defined in Numeric.Data.Interval.Internal

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, SingIntervalBound l, SingIntervalBound 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, SingIntervalBound l, SingIntervalBound 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. (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

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. (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

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

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

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. (Num a, Ord a, SingIntervalBound l, SingIntervalBound 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