Skip to content

Commit b4e1984

Browse files
committed
tags wip
1 parent 539f41a commit b4e1984

File tree

2 files changed

+36
-22
lines changed

2 files changed

+36
-22
lines changed

pub/functora/src/money/Functora/Money.hs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -65,29 +65,28 @@ type NewRatTags lhs rhs =
6565
RatTags lhs
6666
)
6767

68-
--
69-
-- TODO : Use MaybeGetTag instead to pattern match on (Just _)?
70-
--
71-
type family MoneyTagsFamily tags tag where
72-
MoneyTagsFamily tags 'MoneyAmount = tags
73-
MoneyTagsFamily tags 'Currency = tags
74-
MoneyTagsFamily tags 'QuotePerBase = tags
75-
MoneyTagsFamily tags 'FeeRate = tags
76-
MoneyTagsFamily tags 'ProfitRate = tags
68+
type family MoneyTagsFamily tags mtag where
69+
MoneyTagsFamily tags ('Just _) = tags
70+
MoneyTagsFamily tags ('Nothing :: Maybe k) =
71+
TypeError
72+
( 'ShowType k
73+
':<>: 'Text " key is missing in "
74+
':<>: 'ShowType tags
75+
)
7776

7877
type Money tags =
7978
Tagged
8079
tags
8180
( Ratio
8281
( IntRep
83-
( MoneyTagsFamily tags (GetTag MoneyKind tags)
82+
( MoneyTagsFamily tags (MaybeGetTag MoneyKind tags)
8483
)
8584
)
8685
)
8786

8887
type MoneyTags tags =
8988
( RatTags tags,
90-
tags ~ MoneyTagsFamily tags (GetTag MoneyKind tags)
89+
tags ~ MoneyTagsFamily tags (MaybeGetTag MoneyKind tags)
9190
)
9291

9392
type NewMoneyTags lhs rhs =

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

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ module Functora.TagsFamily
1212

1313
-- * Accessors
1414
-- $accessors
15+
MaybeGetTag,
1516
GetTag,
1617
HasTag,
1718

@@ -69,7 +70,9 @@ type family lhs |&| rhs where
6970
-- $accessors
7071
-- Accessors
7172

72-
type GetTag k tags = GetTagFamily ('Nothing :: Maybe k) k tags tags
73+
type MaybeGetTag k tags = MaybeGetTagFamily ('Nothing :: Maybe k) k tags tags
74+
75+
type GetTag k tags = GetTagFamily k tags (MaybeGetTag k tags)
7376

7477
type HasTag (v :: k) tags =
7578
( SingI v,
@@ -152,26 +155,38 @@ type family UnTagFamily member v tags prev next where
152155
UnTagFamily member v tags (kv ': prev) next =
153156
UnTagFamily member v tags prev (kv ': next)
154157

155-
type family GetTagFamily mv k tags prev where
156-
GetTagFamily ('Just (v :: k)) k _ '[] = v
157-
GetTagFamily 'Nothing k tags '[] =
158+
type family MaybeGetTagFamily mv k tags prev where
159+
MaybeGetTagFamily ('Just (v :: k)) k _ '[] = 'Just v
160+
MaybeGetTagFamily 'Nothing _ _ '[] = 'Nothing
161+
MaybeGetTagFamily ('Just v) k tags ((k ':-> Sing v) ': _) =
158162
TypeError
159-
( 'ShowType k
160-
':<>: 'Text " key is missing in "
163+
( 'ShowType v
164+
':<>: 'Text " :: "
165+
':<>: 'ShowType k
166+
':<>: 'Text " tag conflicts with "
161167
':<>: 'ShowType tags
162168
)
163-
GetTagFamily ('Just v) k tags ((k ':-> Sing v) ': _) =
169+
MaybeGetTagFamily 'Nothing k tags ((k ':-> Sing v) ': next) =
170+
MaybeGetTagFamily ('Just v) k tags next
171+
MaybeGetTagFamily mv k tags (_ ': next) =
172+
MaybeGetTagFamily mv k tags next
173+
174+
type family GetTagFamily k tags mv where
175+
GetTagFamily k _ ('Just (v :: k)) = v
176+
GetTagFamily k tags ('Just v) =
164177
TypeError
165178
( 'ShowType v
166179
':<>: 'Text " :: "
167180
':<>: 'ShowType k
168181
':<>: 'Text " tag conflicts with "
169182
':<>: 'ShowType tags
170183
)
171-
GetTagFamily 'Nothing k tags ((k ':-> Sing v) ': next) =
172-
GetTagFamily ('Just v) k tags next
173-
GetTagFamily mv k tags (_ ': next) =
174-
GetTagFamily mv k tags next
184+
GetTagFamily k tags 'Nothing =
185+
TypeError
186+
( 'ShowType k
187+
':<>: 'Text " key is missing in "
188+
':<>: 'ShowType tags
189+
)
175190

176191
--
177192
-- TODO : NEED A PROPER INSTANCE!

0 commit comments

Comments
 (0)