Skip to content

Commit 8f2cc22

Browse files
committed
new: SourceInfo Less Equality
1 parent 3a08760 commit 8f2cc22

File tree

4 files changed

+143
-14
lines changed

4 files changed

+143
-14
lines changed

lambda-buffers-compiler/lambda-buffers-compiler.cabal

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,11 @@ library
9494
import: common-imports
9595
build-depends:
9696
, containers >=0.6.5.1
97+
, data-default >=0.7
9798
, freer-simple >=1.2
9899
, generic-arbitrary
99100
, generic-lens >=2.2
101+
, generics-sop >=0.5
100102
, lambda-buffers-compiler-pb >=0.1.0.0
101103
, mtl >=2.2
102104
, parsec >=3.1
@@ -119,6 +121,7 @@ library
119121
LambdaBuffers.Compiler.NamingCheck
120122
LambdaBuffers.Compiler.ProtoCompat
121123
LambdaBuffers.Compiler.ProtoCompat.FromProto
124+
LambdaBuffers.Compiler.ProtoCompat.SILEq
122125
LambdaBuffers.Compiler.ProtoCompat.Types
123126
LambdaBuffers.Compiler.TypeClassCheck
124127
LambdaBuffers.Compiler.TypeClassCheck.Compat

lambda-buffers-compiler/src/LambdaBuffers/Compiler/ProtoCompat.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
module LambdaBuffers.Compiler.ProtoCompat (
44
module FromProto,
55
module Types,
6+
module SILEq,
67
) where
78

89
import LambdaBuffers.Compiler.ProtoCompat.FromProto as FromProto
10+
import LambdaBuffers.Compiler.ProtoCompat.SILEq as SILEq
911
import LambdaBuffers.Compiler.ProtoCompat.Types as Types
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
{-# LANGUAGE DefaultSignatures #-}
2+
{-# LANGUAGE UndecidableInstances #-}
3+
4+
module LambdaBuffers.Compiler.ProtoCompat.SILEq (
5+
(=:=),
6+
SILEq (sileq),
7+
) where
8+
9+
import Data.Bifunctor (Bifunctor (bimap))
10+
import Data.Map qualified as M
11+
import Data.Set qualified as S
12+
import Data.Text (Text)
13+
import Generics.SOP (All2, Generic (..), Proxy (..), hcmap, mapII)
14+
15+
{- | SourceInfo Less Equality.
16+
A TypeClass that enables equality without taking into consideration the SourceInfo inside a datatype.
17+
-}
18+
class Eq a => SILEq a where
19+
sileq :: a -> a
20+
default sileq :: (Generic a, All2 SILEq (Code a)) => a -> a
21+
sileq = gsileq
22+
23+
gsileq :: (Generic a, All2 SILEq (Code a)) => a -> a
24+
gsileq = to . hcmap (Proxy :: Proxy SILEq) (mapII sileq) . from
25+
26+
{- | Equality without SourceInfo.
27+
If the type does not contain SourceInfo then: (==) = (=:=).
28+
-}
29+
(=:=) :: SILEq a => a -> a -> Bool
30+
(=:=) a b = sileq a == sileq b
31+
32+
instance SILEq a => SILEq [a] where
33+
sileq = fmap sileq
34+
35+
instance SILEq Int where
36+
sileq = id
37+
38+
instance SILEq Text where
39+
sileq = id
40+
41+
instance (Ord k, SILEq k, SILEq v) => SILEq (M.Map k v) where
42+
sileq = M.fromList . fmap (bimap sileq sileq) . M.toList
43+
44+
instance (Ord a, SILEq a) => SILEq (S.Set a) where
45+
sileq = S.fromList . fmap sileq . S.toList

0 commit comments

Comments
 (0)