Skip to content

Commit e4e52ce

Browse files
LiamGoodacrepaf31
authored andcommitted
Add Type.Data.Ordering; Reexport Data.Symbols, Type.Equality (#1)
* Add Type.Data.Ordering; Reexport Data.Symbols, Type.Equality * Don't alias modules for export * Remove unnecessary coersion in reifyOrdering
1 parent 4444368 commit e4e52ce

File tree

3 files changed

+76
-3
lines changed

3 files changed

+76
-3
lines changed

bower.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@
1616
"package.json"
1717
],
1818
"dependencies": {
19-
"purescript-proxy": "^1.0.0"
19+
"purescript-proxy": "^1.0.0",
20+
"purescript-symbols": "^2.0.0",
21+
"purescript-type-equality": "^1.0.0"
22+
},
23+
"devDependencies": {
24+
"purescript-psci-support": "^2.0.0"
2025
}
2126
}

src/Type/Data/Ordering.purs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
module Type.Data.Ordering
2+
( kind Ordering
3+
, LT
4+
, EQ
5+
, GT
6+
, OProxy(..)
7+
, class IsOrdering
8+
, reflectOrdering
9+
, reifyOrdering
10+
, class AppendOrdering
11+
, appendOrdering
12+
, class InvertOrdering
13+
, invertOrdering
14+
) where
15+
16+
import Data.Ordering (Ordering(..))
17+
18+
foreign import kind Ordering
19+
foreign import data LT :: Ordering
20+
foreign import data EQ :: Ordering
21+
foreign import data GT :: Ordering
22+
23+
-- | Value proxy for `Ordering` types
24+
data OProxy (ordering :: Ordering) = OProxy
25+
26+
-- | Class for reflecting a type level `Ordering` at the value level
27+
class IsOrdering (ordering :: Ordering) where
28+
reflectOrdering :: OProxy ordering -> Ordering
29+
30+
instance isOrderingLT :: IsOrdering LT where reflectOrdering _ = LT
31+
instance isOrderingEQ :: IsOrdering EQ where reflectOrdering _ = EQ
32+
instance isOrderingGT :: IsOrdering GT where reflectOrdering _ = GT
33+
34+
-- | Use a value level `Ordering` as a type-level `Ordering`
35+
reifyOrdering :: forall r. Ordering -> (forall o. IsOrdering o => OProxy o -> r) -> r
36+
reifyOrdering LT f = f (OProxy :: OProxy LT)
37+
reifyOrdering EQ f = f (OProxy :: OProxy EQ)
38+
reifyOrdering GT f = f (OProxy :: OProxy GT)
39+
40+
-- | Append two `Ordering` types together
41+
-- | Reflective of the semigroup for value level `Ordering`
42+
class AppendOrdering (lhs :: Ordering)
43+
(rhs :: Ordering)
44+
(output :: Ordering) |
45+
lhs -> rhs output
46+
instance appendOrderingLT :: AppendOrdering LT rhs LT
47+
instance appendOrderingEQ :: AppendOrdering EQ rhs rhs
48+
instance appendOrderingGT :: AppendOrdering GT rhs GT
49+
50+
appendOrdering :: forall l r o. AppendOrdering l r o => OProxy l -> OProxy r -> OProxy o
51+
appendOrdering _ _ = OProxy
52+
53+
-- | Invert an `Ordering`
54+
class InvertOrdering (ordering :: Ordering)
55+
(result :: Ordering) |
56+
ordering -> result
57+
instance invertOrderingLT :: InvertOrdering LT GT
58+
instance invertOrderingEQ :: InvertOrdering EQ EQ
59+
instance invertOrderingGT :: InvertOrdering GT LT
60+
61+
invertOrdering :: forall i o. InvertOrdering i o => OProxy i -> OProxy o
62+
invertOrdering _ = OProxy

src/Type/Prelude.purs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
module Type.Prelude
2-
( module Proxy
2+
( module Type.Equality
3+
, module Type.Data.Ordering
4+
, module Type.Proxy
5+
, module Data.Symbol
36
) where
47

5-
import Type.Proxy (Proxy(..)) as Proxy
8+
import Type.Equality (class TypeEquals, from, to)
9+
import Type.Data.Ordering (kind Ordering, LT, EQ, GT, OProxy(..), class IsOrdering, reflectOrdering, reifyOrdering)
10+
import Type.Proxy (Proxy(..))
11+
import Data.Symbol (SProxy(..), class IsSymbol, reflectSymbol, reifySymbol)

0 commit comments

Comments
 (0)