Skip to content

Commit 67ca083

Browse files
committed
refactor tags
1 parent 6b30a1e commit 67ca083

File tree

2 files changed

+35
-107
lines changed

2 files changed

+35
-107
lines changed

pub/functora/src/tags/Functora/TagsFamily.hs

Lines changed: 26 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,21 @@
44
module Functora.TagsFamily
55
( -- * Constructors
66
-- $constructors
7-
TagsKind,
87
type Tags,
8+
type NoTags,
99
type (|+|),
1010
type (|-|),
1111
type (|&|),
12-
type NoTags,
1312

1413
-- * Accessors
1514
-- $accessors
16-
HasKey,
17-
HasNotKey,
18-
HasTag,
19-
HasTags,
2015
GetTag,
2116
GetKey,
22-
GetTagDef,
2317

24-
-- * Introspection
25-
-- $introspection
18+
-- * Fingerprints
19+
-- $fingerprints
2620
Fgpt,
2721
mkFgpt,
28-
inspectTags,
2922

3023
-- * Reexport
3124
module X,
@@ -34,10 +27,9 @@ where
3427

3528
import Data.Data as X (Data)
3629
import Data.Kind (Type)
37-
import Data.String (IsString, fromString)
3830
import Data.Type.Bool as X (type Not, type (&&))
3931
import Data.Type.Equality as X (type (==))
40-
import Data.Type.Map (AsMap, Cmp, IsMap, Lookup, Mapping ((:->)), Member)
32+
import Data.Type.Map (AsMap, Cmp, Mapping ((:->)))
4133
import Data.Typeable
4234
import qualified Data.Typeable as Typeable
4335
import GHC.Generics as X (Generic)
@@ -53,14 +45,15 @@ import qualified LiftType
5345
import Singlethongs as X
5446
import Prelude
5547

56-
type TagsKind = [Mapping Type Type]
57-
58-
type NoTags = ('[] :: [Mapping Type Type])
48+
-- $constructors
49+
-- Constructors
5950

6051
type family Tags v where
6152
Tags (v :: k) =
6253
'[k ':-> Sing v]
6354

55+
type NoTags = ('[] :: [Mapping Type Type])
56+
6457
type family tags |+| v where
6558
tags |+| v =
6659
AsMap (AddTagFamily v tags tags '[])
@@ -71,41 +64,20 @@ type family tags |-| v where
7164

7265
type family lhs |&| rhs where
7366
'[] |&| rhs = AsMap rhs
74-
((_ ':-> v) ': lhs) |&| rhs = (lhs |&| (rhs |+| v))
67+
((_ ':-> v) ': lhs) |&| rhs = lhs |&| (rhs |+| v)
7568

76-
type HasKey k tags =
77-
( IsMap tags,
78-
Typeable (GetVals tags),
79-
Member k tags ~ 'True
80-
)
81-
82-
type HasNotKey k tags =
83-
( IsMap tags,
84-
Typeable (GetVals tags),
85-
Member k tags ~ 'False
86-
)
87-
88-
type HasTag v tags =
89-
( HasTags (Tags v) tags
90-
)
91-
92-
type HasTags sub sup =
93-
( IsMap sub,
94-
IsMap sup,
95-
Typeable (GetVals sub),
96-
Typeable (GetVals sup),
97-
HasTagsFamily 'Nothing sub sup ~ 'True
98-
)
69+
-- $accessors
70+
-- Accessors
9971

10072
type GetTag (v :: k) tags =
101-
( v ~ GetTagFamily k tags tags,
102-
SingI v,
103-
HasTag v tags
73+
( v ~ GetTagFamily ('Nothing :: Maybe k) k tags tags,
74+
SingI v
10475
)
10576

106-
type GetKey k tags = GetTagFamily k tags tags
77+
type GetKey k tags = GetTagFamily ('Nothing :: Maybe k) k tags tags
10778

108-
type GetTagDef (def :: k) tags = GetTagDefFamily def tags tags
79+
-- $fingerprints
80+
-- Fingerprints
10981

11082
type family Fgpt (a :: k) :: Symbol
11183

@@ -135,18 +107,6 @@ mkFgpt =
135107
)
136108
|]
137109

138-
inspectTags ::
139-
forall tags text vals.
140-
( HasVals vals tags,
141-
IsString text
142-
) =>
143-
text
144-
inspectTags =
145-
fromString
146-
. show
147-
. Typeable.typeRep
148-
$ Proxy @vals
149-
150110
--
151111
-- Private
152112
--
@@ -189,58 +149,26 @@ type family UnTagFamily member v tags prev next where
189149
UnTagFamily member v tags (kv ': prev) next =
190150
UnTagFamily member v tags prev (kv ': next)
191151

192-
type family GetTagFamily k tags prev where
193-
GetTagFamily k _ ((k ':-> Sing v) ': _) = v
194-
GetTagFamily k tags (_ ': next) = GetTagFamily k tags next
195-
GetTagFamily k tags '[] =
152+
type family GetTagFamily mv k tags prev where
153+
GetTagFamily ('Just (v :: k)) k _ '[] = v
154+
GetTagFamily 'Nothing k tags '[] =
196155
TypeError
197156
( 'ShowType k
198157
':<>: 'Text " key is missing in "
199158
':<>: 'ShowType tags
200159
)
201-
202-
type family GetTagDefFamily (def :: k) tags prev where
203-
GetTagDefFamily (_ :: k) _ ((k ':-> Sing v) ': _) = v
204-
GetTagDefFamily def tags (_ ': next) = GetTagDefFamily def tags next
205-
GetTagDefFamily def _ '[] = def
206-
207-
type family HasTagsFamily hastag submap supmap where
208-
HasTagsFamily 'Nothing '[] _ = 'True
209-
HasTagsFamily has '[] sup =
210-
TypeError
211-
( 'Text "Impossible HasTagsFamily "
212-
':<>: 'ShowType has
213-
':<>: 'Text " clause with "
214-
':<>: 'ShowType sup
215-
)
216-
HasTagsFamily 'Nothing ((k ':-> v) ': sub) sup =
217-
HasTagsFamily
218-
('Just (Lookup sup k == 'Just v))
219-
((k ':-> v) ': sub)
220-
sup
221-
HasTagsFamily ('Just 'True) (_ ': sub) sup =
222-
HasTagsFamily 'Nothing sub sup
223-
HasTagsFamily ('Just 'False) ((k ':-> v) ': _) sup =
160+
GetTagFamily ('Just v) k tags ((k ':-> Sing v) ': _) =
224161
TypeError
225162
( 'ShowType v
226163
':<>: 'Text " :: "
227164
':<>: 'ShowType k
228-
':<>: 'Text " tag is missing in "
229-
':<>: 'ShowType sup
165+
':<>: 'Text " tag conflicts with "
166+
':<>: 'ShowType tags
230167
)
231-
232-
type family ToValsFamily map lst where
233-
ToValsFamily '[] acc = acc
234-
ToValsFamily ((_ ':-> v) ': tail) acc =
235-
ToValsFamily tail (v ': acc)
236-
237-
type GetVals tags = ToValsFamily tags '[]
238-
239-
type HasVals vals tags =
240-
( IsMap tags,
241-
Typeable vals,
242-
vals ~ GetVals tags
243-
)
168+
GetTagFamily 'Nothing k tags ((k ':-> Sing v) ': next) =
169+
GetTagFamily ('Just v) k tags next
170+
GetTagFamily mv k tags (_ ': next) =
171+
GetTagFamily mv k tags next
244172

245173
--
246174
-- TODO : NEED A PROPER INSTANCE!

pub/functora/test/Functora/TagsSpec.hs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,12 @@ spec = do
6767
`shouldBe` "Tagged (4 % 5)"
6868
inspect @Text (newMoney @(Tags "BTC" |+| 'Net |+| 'Gain))
6969
`shouldBe` "Tagged (4 % 5)"
70-
it "inspectTags" $ do
71-
inspectTags @NoTags @Text
72-
`shouldBe` "'[] *"
73-
inspectTags @(NoTags |+| "BTC" |+| 'Net) @Text
74-
`shouldBe` "': * (Sing NetOrGross 'Net) (': * (Sing Symbol \"BTC\") ('[] *))"
75-
inspectTags @(Tags "BTC" |+| 'Net |+| 'Gain) @Text
76-
`shouldBe` "': * (Sing NetOrGross 'Net) (': * (Sing GainOrLose 'Gain) (': * (Sing Symbol \"BTC\") ('[] *)))"
77-
inspectTags @(Tags "BTC" |+| 'Net |+| 'Gain) @Text
78-
`shouldBe` inspectTags @(NoTags |+| "BTC" |+| 'Net |+| 'Gain)
70+
it "inspectType" $ do
71+
inspectType @NoTags @Text
72+
`shouldBe` "'[] (Mapping * *)"
73+
inspectType @(NoTags |+| "BTC" |+| 'Net) @Text
74+
`shouldBe` "': (Mapping * *) (':-> * * Symbol (Sing Symbol \"BTC\")) (': (Mapping * *) (':-> * * NetOrGross (Sing NetOrGross 'Net)) ('[] (Mapping * *)))"
75+
inspectType @(Tags "BTC" |+| 'Net |+| 'Gain) @Text
76+
`shouldBe` "': (Mapping * *) (':-> * * Symbol (Sing Symbol \"BTC\")) (': (Mapping * *) (':-> * * GainOrLose (Sing GainOrLose 'Gain)) (': (Mapping * *) (':-> * * NetOrGross (Sing NetOrGross 'Net)) ('[] (Mapping * *))))"
77+
inspectType @(Tags "BTC" |+| 'Net |+| 'Gain) @Text
78+
`shouldBe` inspectType @(NoTags |+| "BTC" |+| 'Net |+| 'Gain)

0 commit comments

Comments
 (0)