Skip to content

Commit 5a26b1e

Browse files
author
Tom Harding
committed
Finish record instances and add tests
As far as I can tell, there are now instances for all applicable typeclasses given for primitive records. I've even added tests, which typecheck (good news), though I don't think any of them actually run.
1 parent 1c6a562 commit 5a26b1e

File tree

13 files changed

+196
-212
lines changed

13 files changed

+196
-212
lines changed

src/Data/BooleanAlgebra.purs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module Data.BooleanAlgebra
33
, module Data.HeytingAlgebra
44
) where
55

6-
import Data.HeytingAlgebra (class HeytingAlgebra, class HeytingAlgebraRecord, ff, tt, implies, conj, disj, not, (&&), (||))
6+
import Data.HeytingAlgebra (class HeytingAlgebra, class HeytingAlgebraRow, ff, tt, implies, conj, disj, not, (&&), (||))
77
import Data.Unit (Unit)
88
import Prim.RowList as RL
99

@@ -23,6 +23,6 @@ instance booleanAlgebraFn :: BooleanAlgebra b => BooleanAlgebra (a -> b)
2323

2424
instance booleanAlgebraRecord
2525
:: ( RL.RowToList row list
26-
, HeytingAlgebraRecord list row row focus
26+
, HeytingAlgebraRow list row row focus
2727
)
2828
=> BooleanAlgebra (Record row)

src/Data/Bounded.purs

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -51,40 +51,3 @@ foreign import bottomNumber :: Number
5151
instance boundedNumber :: Bounded Number where
5252
top = topNumber
5353
bottom = bottomNumber
54-
55-
-- Similarly to the `OrdRecord` constraint, this implementation is potentially
56-
-- unstable. However, it is left here as a reference:
57-
58-
--class BoundedRecord rowlist row subrow focus | rowlist -> subrow focus where
59-
-- bottomRecordImpl :: RLProxy rowlist -> RProxy row -> Record subrow
60-
-- topRecordImpl :: RLProxy rowlist -> RProxy row -> Record subrow
61-
--
62-
--instance boundedRecordNil :: BoundedRecord RL.Nil row () focus where
63-
-- bottomRecordImpl _ _ = {}
64-
-- topRecordImpl _ _ = {}
65-
--
66-
--instance boundedRecordCons
67-
-- :: ( BoundedRecord rowlistTail row subrowTail subfocus
68-
-- , Row.Cons key focus subrowTail subrow
69-
-- , IsSymbol key
70-
-- , Bounded focus
71-
-- )
72-
-- => BoundedRecord (Row.Cons key focus rowlistTail) row subrow focus where
73-
-- bottomRecordImpl _ row
74-
-- = unsafeInsert key (bottom :: focus)
75-
-- (bottomRecordImpl (RLProxy :: RLProxy rowlistTail) row)
76-
-- where key = reflectSymbol (SProxy :: SProxy key)
77-
--
78-
-- topRecordImpl _ row
79-
-- = unsafeInsert key (bottom :: focus)
80-
-- (topRecordImpl (RLProxy :: RLProxy rowlistTail) row)
81-
-- where key = reflectSymbol (SProxy :: SProxy key)
82-
--
83-
--instance boundedRecord
84-
-- :: ( RL.RowToList row list
85-
-- , BoundedRecord list row row focus
86-
-- , OrdRecord list row row focus
87-
-- )
88-
-- => Bounded (Record row) where
89-
-- bottom = bottomRecordImpl (RLProxy :: RLProxy list) (RProxy :: RProxy row)
90-
-- top = topRecordImpl (RLProxy :: RLProxy list) (RProxy :: RProxy row)

src/Data/CommutativeRing.purs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ module Data.CommutativeRing
44
, module Data.Semiring
55
) where
66

7-
import Data.Ring (class Ring, class RingRecord)
8-
import Data.Semiring (class Semiring, class SemiringRecord, add, mul, one, zero, (*), (+))
7+
import Data.Ring (class Ring, class RingRow)
8+
import Data.Semiring (class Semiring, class SemiringRow, add, mul, one, zero, (*), (+))
99
import Data.Unit (Unit)
1010
import Prim.RowList as RL
1111

@@ -25,7 +25,7 @@ instance commutativeRingFn :: CommutativeRing b => CommutativeRing (a -> b)
2525

2626
instance commutativeRingRecord
2727
:: ( RL.RowToList row list
28-
, SemiringRecord list row row focus
29-
, RingRecord list row row focus
28+
, SemiringRow list row row focus
29+
, RingRow list row row focus
3030
)
3131
=> CommutativeRing (Record row)

src/Data/DivisionRing.purs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ module Data.DivisionRing
77
, module Data.Semiring
88
) where
99

10+
import Data.EuclideanRing ((/))
1011
import Data.Ring (class Ring, negate, sub)
1112
import Data.Semiring (class Semiring, add, mul, one, zero, (*), (+))
12-
import Data.EuclideanRing ((/))
1313

1414
-- | The `DivisionRing` class is for non-zero rings in which every non-zero
1515
-- | element has a multiplicative inverse. Division rings are sometimes also

src/Data/Eq.purs

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ module Data.Eq
22
( class Eq, eq, (==), notEq, (/=)
33
, class Eq1, eq1, notEq1
44

5-
, class EqRecord
5+
, class EqRow
66
, eqRecordImpl
77
) where
88

99
import Data.HeytingAlgebra ((&&))
1010
import Data.Internal.Record (unsafeGet)
11-
import Data.RowList (RLProxy(..))
11+
import Type.Data.RowList (RLProxy(..))
1212
import Data.Symbol (class IsSymbol, SProxy(..), reflectSymbol)
1313
import Data.Unit (Unit)
1414
import Data.Void (Void)
@@ -76,28 +76,29 @@ instance eq1Array :: Eq1 Array where
7676
notEq1 :: forall f a. Eq1 f => Eq a => f a -> f a -> Boolean
7777
notEq1 x y = (x `eq1` y) == false
7878

79-
class EqRecord rowlist row focus | rowlist -> focus where
79+
-- | A typeclass to characterise rows of types that are all Eq..
80+
class EqRow rowlist row focus | rowlist -> focus where
8081
eqRecordImpl :: RLProxy rowlist -> Record row -> Record row -> Boolean
8182

82-
instance eqRecordNil :: EqRecord RL.Nil row focus where
83+
instance eqRowNil :: EqRow RL.Nil row focus where
8384
eqRecordImpl _ _ _ = true
8485

85-
instance eqRecordCons
86-
:: ( EqRecord rowlistTail row subfocus
86+
instance eqRowCons
87+
:: ( EqRow rowlistTail row subfocus
8788
, Row.Cons key focus rowTail row
8889
, IsSymbol key
8990
, Eq focus
9091
)
91-
=> EqRecord (RL.Cons key focus rowlistTail) row focus where
92-
eqRecordImpl _ ra rb
93-
= unsafeGet' key ra == unsafeGet key rb
94-
&& eqRecordImpl (RLProxy :: RLProxy rowlistTail) ra rb
95-
where key = reflectSymbol (SProxy :: SProxy key)
96-
unsafeGet' = unsafeGet :: String -> Record row -> focus
92+
=> EqRow (RL.Cons key focus rowlistTail) row focus where
93+
eqRecordImpl _ ra rb = (get ra == get rb) && tail
94+
where
95+
key = reflectSymbol (SProxy :: SProxy key)
96+
get = unsafeGet key :: Record row -> focus
97+
tail = eqRecordImpl (RLProxy :: RLProxy rowlistTail) ra rb
9798

9899
instance eqRecord
99100
:: ( RL.RowToList row list
100-
, EqRecord list row focus
101+
, EqRow list row focus
101102
)
102103
=> Eq (Record row) where
103104
eq = eqRecordImpl (RLProxy :: RLProxy list)

src/Data/HeytingAlgebra.purs

Lines changed: 38 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ module Data.HeytingAlgebra
1010
, (&&)
1111
, (||)
1212

13-
, class HeytingAlgebraRecord
13+
, class HeytingAlgebraRow
1414
, ffRecordImpl
1515
, ttRecordImpl
1616
, impliesRecordImpl
@@ -20,12 +20,12 @@ module Data.HeytingAlgebra
2020
) where
2121

2222
import Data.Internal.Record (unsafeGet, unsafeInsert)
23-
import Data.RowList (RLProxy(..))
2423
import Data.Symbol (class IsSymbol, SProxy(..), reflectSymbol)
2524
import Data.Unit (Unit, unit)
2625
import Prim.Row as Row
2726
import Prim.RowList as RL
2827
import Type.Data.Row (RProxy(..))
28+
import Type.Data.RowList (RLProxy(..))
2929

3030
-- | The `HeytingAlgebra` type class represents types that are bounded lattices with
3131
-- | an implication operator such that the following laws hold:
@@ -91,81 +91,73 @@ foreign import boolConj :: Boolean -> Boolean -> Boolean
9191
foreign import boolDisj :: Boolean -> Boolean -> Boolean
9292
foreign import boolNot :: Boolean -> Boolean
9393

94-
class HeytingAlgebraRecord rowlist row subrow focus | rowlist -> subrow focus where
94+
class HeytingAlgebraRow rowlist row subrow focus | rowlist -> subrow focus where
9595
ffRecordImpl :: RLProxy rowlist -> RProxy row -> Record subrow
9696
ttRecordImpl :: RLProxy rowlist -> RProxy row -> Record subrow
9797
impliesRecordImpl :: RLProxy rowlist -> Record row -> Record row -> Record subrow
9898
disjRecordImpl :: RLProxy rowlist -> Record row -> Record row -> Record subrow
9999
conjRecordImpl :: RLProxy rowlist -> Record row -> Record row -> Record subrow
100100
notRecordImpl :: RLProxy rowlist -> Record row -> Record subrow
101101

102-
instance heytingAlgebraRecordNil :: HeytingAlgebraRecord RL.Nil row () focus where
102+
instance heytingAlgebraRowNil :: HeytingAlgebraRow RL.Nil row () focus where
103103
conjRecordImpl _ _ _ = {}
104104
disjRecordImpl _ _ _ = {}
105105
ffRecordImpl _ _ = {}
106106
impliesRecordImpl _ _ _ = {}
107107
notRecordImpl _ _ = {}
108108
ttRecordImpl _ _ = {}
109109

110-
instance heytingAlgebraRecordCons
110+
instance heytingAlgebraRowCons
111111
:: ( IsSymbol key
112112
, Row.Cons key focus subrowTail subrow
113-
, HeytingAlgebraRecord rowlistTail row subrowTail subfocus
113+
, HeytingAlgebraRow rowlistTail row subrowTail subfocus
114114
, HeytingAlgebra focus
115115
)
116-
=> HeytingAlgebraRecord (RL.Cons key focus rowlistTail) row subrow focus where
117-
conjRecordImpl _ ra rb
118-
= unsafeInsert key
119-
(conj (unsafeGet' key ra) (unsafeGet' key rb))
120-
(conjRecordImpl (RLProxy :: RLProxy rowlistTail) ra rb)
121-
where key = reflectSymbol (SProxy :: SProxy key)
122-
unsafeGet' = unsafeGet :: String -> Record row -> focus
123-
124-
disjRecordImpl _ ra rb
125-
= unsafeInsert key
126-
(disj (unsafeGet' key ra) (unsafeGet' key rb))
127-
(disjRecordImpl (RLProxy :: RLProxy rowlistTail) ra rb)
128-
where key = reflectSymbol (SProxy :: SProxy key)
129-
unsafeGet' = unsafeGet :: String -> Record row -> focus
130-
131-
impliesRecordImpl _ ra rb
132-
= unsafeInsert key
133-
(implies (unsafeGet' key ra) (unsafeGet' key rb))
134-
(impliesRecordImpl (RLProxy :: RLProxy rowlistTail) ra rb)
116+
=> HeytingAlgebraRow (RL.Cons key focus rowlistTail) row subrow focus where
117+
conjRecordImpl _ ra rb = insert (conj (get ra) (get rb)) tail
135118
where
136119
key = reflectSymbol (SProxy :: SProxy key)
137-
unsafeGet' = unsafeGet :: String -> Record row -> focus
138-
139-
ffRecordImpl _ _
140-
= unsafeInsert key (ff :: focus)
141-
( ffRecordImpl
142-
(RLProxy :: RLProxy rowlistTail)
143-
(RProxy :: RProxy row)
144-
)
120+
get = unsafeGet key :: Record row -> focus
121+
insert = unsafeInsert key :: focus -> Record subrowTail -> Record subrow
122+
tail = conjRecordImpl (RLProxy :: RLProxy rowlistTail) ra rb
123+
124+
disjRecordImpl _ ra rb = insert (disj (get ra) (get rb)) tail
125+
where
126+
key = reflectSymbol (SProxy :: SProxy key)
127+
get = unsafeGet key :: Record row -> focus
128+
insert = unsafeInsert key :: focus -> Record subrowTail -> Record subrow
129+
tail = disjRecordImpl (RLProxy :: RLProxy rowlistTail) ra rb
130+
131+
impliesRecordImpl _ ra rb = insert (implies (get ra) (get rb)) tail
145132
where
146133
key = reflectSymbol (SProxy :: SProxy key)
147-
unsafeGet' = unsafeGet :: String -> Record row -> focus
134+
get = unsafeGet key :: Record row -> focus
135+
insert = unsafeInsert key :: focus -> Record subrowTail -> Record subrow
136+
tail = impliesRecordImpl (RLProxy :: RLProxy rowlistTail) ra rb
137+
138+
ffRecordImpl _ row = insert ff tail
139+
where
140+
key = reflectSymbol (SProxy :: SProxy key)
141+
insert = unsafeInsert key :: focus -> Record subrowTail -> Record subrow
142+
tail = ffRecordImpl (RLProxy :: RLProxy rowlistTail) row
148143

149144
notRecordImpl _ row
150-
= unsafeInsert key (not (unsafeGet' key row))
151-
(notRecordImpl (RLProxy :: RLProxy rowlistTail) row)
145+
= insert (not (get row)) tail
152146
where
153147
key = reflectSymbol (SProxy :: SProxy key)
154-
unsafeGet' = unsafeGet :: String -> Record row -> focus
155-
156-
ttRecordImpl _ _
157-
= unsafeInsert key (tt :: focus)
158-
( ttRecordImpl
159-
(RLProxy :: RLProxy rowlistTail)
160-
(RProxy :: RProxy row)
161-
)
148+
get = unsafeGet key :: Record row -> focus
149+
insert = unsafeInsert key :: focus -> Record subrowTail -> Record subrow
150+
tail = notRecordImpl (RLProxy :: RLProxy rowlistTail) row
151+
152+
ttRecordImpl _ row = insert tt tail
162153
where
163154
key = reflectSymbol (SProxy :: SProxy key)
164-
unsafeGet' = unsafeGet :: String -> Record row -> focus
155+
insert = unsafeInsert key :: focus -> Record subrowTail -> Record subrow
156+
tail = ttRecordImpl (RLProxy :: RLProxy rowlistTail) row
165157

166158
instance heytingAlgebraRecord
167159
:: ( RL.RowToList row list
168-
, HeytingAlgebraRecord list row row focus
160+
, HeytingAlgebraRow list row row focus
169161
)
170162
=> HeytingAlgebra (Record row) where
171163
ff = ffRecordImpl (RLProxy :: RLProxy list) (RProxy :: RProxy row)

src/Data/Monoid.purs

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ module Data.Monoid
33
, power
44
, guard
55
, module Data.Semigroup
6+
7+
, class MonoidRow
8+
, memptyRecordImpl
69
) where
710

811
import Data.Boolean (otherwise)
@@ -11,10 +14,11 @@ import Data.EuclideanRing (mod, (/))
1114
import Data.Internal.Record (unsafeInsert)
1215
import Data.Ord ((<=))
1316
import Data.Ordering (Ordering(..))
14-
import Data.RowList (RLProxy(..))
15-
import Data.Semigroup (class Semigroup, class SemigroupRecord, (<>))
17+
import Type.Data.RowList (RLProxy(..))
18+
import Data.Semigroup (class Semigroup, class SemigroupRow, (<>))
1619
import Data.Symbol (class IsSymbol, SProxy(..), reflectSymbol)
1720
import Data.Unit (Unit, unit)
21+
import Prim.Row as Row
1822
import Prim.RowList as RL
1923

2024
-- | A `Monoid` is a `Semigroup` with a value `mempty`, which is both a
@@ -45,33 +49,33 @@ instance monoidString :: Monoid String where
4549
instance monoidArray :: Monoid (Array a) where
4650
mempty = []
4751

48-
class MonoidRecord rowlist row focus | rowlist -> row focus where
49-
monoidRecordImpl :: RLProxy rowlist -> Record row
52+
class MonoidRow rowlist subrow focus | rowlist -> subrow focus where
53+
memptyRecordImpl :: RLProxy rowlist -> Record subrow
5054

51-
instance monoidRecordNil :: MonoidRecord RL.Nil () focus where
52-
monoidRecordImpl _ = {}
55+
instance monoidRowNil :: MonoidRow RL.Nil () focus where
56+
memptyRecordImpl _ = {}
5357

54-
instance monoidRecordCons
58+
instance monoidRowCons
5559
:: ( IsSymbol key
5660
, Monoid focus
57-
, MonoidRecord rowlistTail row subfocus
61+
, Row.Cons key focus subrowTail subrow
62+
, MonoidRow rowlistTail subrowTail subfocus
5863
)
59-
=> MonoidRecord (RL.Cons key focus rowlistTail) row focus where
60-
monoidRecordImpl _
61-
= unsafeInsert key
62-
(mempty :: focus)
63-
(monoidRecordImpl (RLProxy :: RLProxy rowlistTail))
64+
=> MonoidRow (RL.Cons key focus rowlistTail) subrow focus where
65+
memptyRecordImpl _
66+
= insert mempty tail
6467
where
6568
key = reflectSymbol (SProxy :: SProxy key)
69+
insert = unsafeInsert key :: focus -> Record subrowTail -> Record subrow
70+
tail = memptyRecordImpl (RLProxy :: RLProxy rowlistTail)
6671

6772
instance monoidRecord
6873
:: ( RL.RowToList row list
69-
, SemigroupRecord list row row focus
70-
, MonoidRecord list row focus
74+
, SemigroupRow list row row focus
75+
, MonoidRow list row focus
7176
)
7277
=> Monoid (Record row) where
73-
mempty = monoidRecordImpl (RLProxy :: RLProxy list)
74-
78+
mempty = memptyRecordImpl (RLProxy :: RLProxy list)
7579

7680
-- | Append a value to itself a certain number of times. For the
7781
-- | `Multiplicative` type, and for a non-negative power, this is the same as

0 commit comments

Comments
 (0)