com.github.tonivade.purefun.instances.SequenceInstances Maven / Gradle / Ivy
/*
* Copyright (c) 2018-2022, Antonio Gabriel Muñoz Conejo
* Distributed under the terms of the MIT License
*/
package com.github.tonivade.purefun.instances;
import static com.github.tonivade.purefun.data.SequenceOf.toSequence;
import com.github.tonivade.purefun.Eq;
import com.github.tonivade.purefun.Function1;
import com.github.tonivade.purefun.Function2;
import com.github.tonivade.purefun.Kind;
import com.github.tonivade.purefun.Witness;
import com.github.tonivade.purefun.data.ImmutableList;
import com.github.tonivade.purefun.data.Sequence;
import com.github.tonivade.purefun.data.SequenceOf;
import com.github.tonivade.purefun.data.Sequence_;
import com.github.tonivade.purefun.type.Eval;
import com.github.tonivade.purefun.type.EvalOf;
import com.github.tonivade.purefun.typeclasses.Alternative;
import com.github.tonivade.purefun.typeclasses.Applicative;
import com.github.tonivade.purefun.typeclasses.Foldable;
import com.github.tonivade.purefun.typeclasses.Functor;
import com.github.tonivade.purefun.typeclasses.Monad;
import com.github.tonivade.purefun.typeclasses.Monoid;
import com.github.tonivade.purefun.typeclasses.MonoidK;
import com.github.tonivade.purefun.typeclasses.Semigroup;
import com.github.tonivade.purefun.typeclasses.SemigroupK;
import com.github.tonivade.purefun.typeclasses.Traverse;
@SuppressWarnings("unchecked")
public interface SequenceInstances {
static Eq> eq(Eq eqElement) {
return (a, b) -> {
Sequence seq1 = SequenceOf.narrowK(a);
Sequence seq2 = SequenceOf.narrowK(b);
return seq1.size() == seq2.size()
&& Sequence.zip(seq1, seq2).allMatch(tuple -> eqElement.eqv(tuple.get1(), tuple.get2()));
};
}
static Semigroup> semigroup() {
return (SequenceSemigroup) SequenceSemigroup.INSTANCE;
}
static Monoid> monoid() {
return (SequenceMonoid) SequenceMonoid.INSTANCE;
}
static SemigroupK semigroupK() {
return SequenceSemigroupK.INSTANCE;
}
static MonoidK monoidK() {
return SequenceMonoidK.INSTANCE;
}
static Functor functor() {
return SequenceFunctor.INSTANCE;
}
static Applicative applicative() {
return SequenceApplicative.INSTANCE;
}
static SequenceMonad monad() {
return SequenceMonad.INSTANCE;
}
static Alternative alternative() {
return SequenceAlternative.INSTANCE;
}
static Traverse traverse() {
return SequenceTraverse.INSTANCE;
}
static Foldable foldable() {
return SequenceFoldable.INSTANCE;
}
}
interface SequenceSemigroup extends Semigroup> {
SequenceSemigroup> INSTANCE = new SequenceSemigroup © 2015 - 2025 Weber Informatics LLC | Privacy Policy