Safe Haskell | None |
---|---|
Language | Haskell2010 |
Provides types for enforcing minimum and maximum bounds.
Since: 0.1
Synopsis
- data IntervalBound
- newtype Interval (l :: IntervalBound) (r :: IntervalBound) a where
- UnsafeInterval a
- 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)
- unsafeInterval :: forall (l :: IntervalBound) (r :: IntervalBound) a. (HasCallStack, Num a, Ord a, SingIntervalBound l, SingIntervalBound r, Show a) => a -> Interval l r a
- data SIntervalBound (i :: IntervalBound) where
- SOpen :: forall (n :: Nat). KnownNat n => SIntervalBound ('Open n)
- SClosed :: forall (n :: Nat). KnownNat n => SIntervalBound ('Closed n)
- SNone :: SIntervalBound 'None
- class SingIntervalBound (s :: IntervalBound) where
- withSingIntervalBound :: forall (i :: IntervalBound) r. SIntervalBound i -> (SingIntervalBound i => r) -> r
- errMsg :: forall (l :: IntervalBound) (r :: IntervalBound) a. (Show a, SingIntervalBound l, SingIntervalBound r) => a -> Builder -> String
Types
data IntervalBound Source #
Interval bound.
Since: 0.1
Instances
newtype Interval (l :: IntervalBound) (r :: IntervalBound) a 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
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 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 afromRational :: Rational -> Interval l r a Source # | |||||
Generic (Interval l r a) Source # | |||||
Defined in Numeric.Data.Interval.Internal
| |||||
(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 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
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
Singletons
data SIntervalBound (i :: IntervalBound) where Source #
Singleton for IntervalBound
.
Since: 0.1
SOpen :: forall (n :: Nat). KnownNat n => SIntervalBound ('Open n) | |
SClosed :: forall (n :: Nat). KnownNat n => SIntervalBound ('Closed n) | |
SNone :: SIntervalBound 'None |
class SingIntervalBound (s :: IntervalBound) where Source #
Class for retrieving the singleton witness from the IntervalBound
.
Since: 0.1
singIntervalBound :: SIntervalBound s Source #
Retrieves the singleton witness.
Since: 0.1
Instances
SingIntervalBound 'None Source # | Since: 0.1 |
Defined in Numeric.Data.Interval.Internal | |
KnownNat k => SingIntervalBound ('Closed k) Source # | Since: 0.1 |
Defined in Numeric.Data.Interval.Internal singIntervalBound :: SIntervalBound ('Closed k) Source # | |
KnownNat k => SingIntervalBound ('Open k) Source # | Since: 0.1 |
Defined in Numeric.Data.Interval.Internal singIntervalBound :: SIntervalBound ('Open k) Source # |
withSingIntervalBound :: forall (i :: IntervalBound) r. SIntervalBound i -> (SingIntervalBound i => r) -> r Source #
Singleton "with"-style convenience function. Allows us to run a
computation SingIntervalBound i => r
without explicitly pattern-matching
every time.
Since: 0.1
Misc
errMsg :: forall (l :: IntervalBound) (r :: IntervalBound) a. (Show a, SingIntervalBound l, SingIntervalBound r) => a -> Builder -> String Source #
Since: 0.1