Skip to content

Instantly share code, notes, and snippets.

@fogfish
Created March 27, 2022 19:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fogfish/d8196f7d38088acfa444117944961595 to your computer and use it in GitHub Desktop.
Save fogfish/d8196f7d38088acfa444117944961595 to your computer and use it in GitHub Desktop.
/*
SeqEq is a heterogeneous product of Seq and Eq laws.
It composes two types together that "knows" how to compare sequences.
*/
type SeqEq[S, T any] struct {
Seq[S, T]
Eq[T]
}
// implements equality rule for sequence using Seq & Eq type classes.
func (seq SeqEq[S, T]) Equal(a, b S) bool {
seqA := a
seqB := b
for !seq.Seq.IsVoid(seqA) && !seq.Seq.IsVoid(seqB) {
headA := seq.Seq.Head(seqA)
headB := seq.Seq.Head(seqB)
if headA == nil || headB == nil || !seq.Eq.Equal(*headA, *headB) {
return false
}
seqA = seq.Seq.Tail(seqA)
seqB = seq.Seq.Tail(seqB)
}
return seq.Seq.IsVoid(seqA) && seq.Seq.IsVoid(seqB)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment