-
Notifications
You must be signed in to change notification settings - Fork 0
/
Bound.purs
84 lines (62 loc) · 2.78 KB
/
Bound.purs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
module Math.Interval.Bound
( module Math.Interval.Bound
, module ForReExport
) where
import Prelude hiding (eq,join)
import Data.Either (Either, either)
import Data.Either.Nested (Either3, at1, at2, at3, either3, in1, in2, in3)
import Data.Maybe (Maybe(..), maybe)
import Data.Newtype (class Newtype, un, unwrap, wrap)
import Math.Interval.Bound.Internal (Bound(..), Core(..), Finite(..), Lower(..), NegInf, PosInf, Upper(..))
import Math.Interval.Bound.Internal (Bound, Finite(..), Lower, NegInf(..), PosInf(..), Upper) as ForReExport
import Math.Interval.Openness (Openness)
lower :: forall n. Either NegInf (Finite n) -> Lower n
lower = MkLower <<< MkCore <<< either in1 in2
upper :: forall n. Either (Finite n) PosInf -> Upper n
upper = MkUpper <<< MkCore <<< either in2 in3
bound :: forall n. Either3 NegInf (Finite n) PosInf -> Bound n
bound = MkBound <<< MkCore <<< either3 in1 in2 in3
lessThan :: forall n. Ord n => n -> Bound n -> Boolean
lessThan n = either3 (const false) ((n < _) <<< _.bound) (const true) <<< raw
lessThanOrEq :: forall n. Ord n => n -> Bound n -> Boolean
lessThanOrEq n = either3 (const false) ((n <= _) <<< _.bound) (const true) <<< raw
greaterThan :: forall n. Ord n => n -> Bound n -> Boolean
greaterThan n b = not $ lessThanOrEq n b
greaterThanOrEq :: forall n. Ord n => n -> Bound n -> Boolean
greaterThanOrEq n b = not $ lessThan n b
eq :: forall n. Eq n => n -> Bound n -> Boolean
eq n = maybe false ((n == _) <<< _.bound <<< unwrap) <<< finite
notEq :: forall n. Eq n => n -> Bound n -> Boolean
notEq = not <<< eq
negInf :: forall n. Bound n -> Boolean
negInf = at1 false (const true) <<< unwrap <<< unwrap
posInf :: forall n. Bound n -> Boolean
posInf = at3 false (const true) <<< unwrap <<< unwrap
finite :: forall n l r t. Newtype t (Core n l r) => t -> Maybe (Finite n)
finite = at2 Nothing Just <<< un MkCore <<< unwrap
injectUpper :: forall n. Upper n -> Bound n
injectUpper = wrap <<< MkCore <<< either3 absurd in2 in3 <<< un MkCore <<< unwrap
projectUpper :: forall n. Bound n -> Maybe (Upper n)
projectUpper =
either3
(const Nothing)
(Just <<< wrap <<< MkCore <<< in2)
(Just <<< wrap <<< MkCore <<< in3) <<<
un MkCore <<< unwrap
injectLower :: forall n. Lower n -> Bound n
injectLower = wrap <<< MkCore <<< either3 in1 in2 absurd <<< un MkCore <<< unwrap
projectLower :: forall n. Bound n -> Maybe (Lower n)
projectLower =
either3
(Just <<< wrap <<< MkCore <<< in1)
(Just <<< wrap <<< MkCore <<< in2)
(const Nothing) <<<
un MkCore <<< unwrap
raw ::
forall l n r t.
Newtype (t n) (Core n l r)
=> t n
-> Either3 l { bound :: n, openness :: Openness } r
raw = either3 in1 (in2 <<< unwrap) in3 <<< un MkCore <<< unwrap
finCore :: forall n l r. { bound :: n , openness :: Openness} -> Core n l r
finCore = MkCore <<< in2 <<< MkFinite