public Pair <X, List <B> > TraversePair <X, B>(Func <A, Pair <X, B> > f, Monoid <X> m) { return(FoldRight <Pair <X, List <B> > >( (a, b) => f(a).Constrain(m).ZipWith <List <B>, List <B> >(b.Constrain(m), aa => bb => aa + bb).Pair , m.Id.And(List <B> .Empty) )); }
public Pair <X, Tree <B> > TraversePair <X, B>(Func <A, Pair <X, B> > f, Monoid <X> m) { return(f(root).Constrain(m).ZipWith <List <Tree <B> >, Tree <B> >( children.TraversePair(w => w.TraversePair(f, m), m).Constrain(m) , b => bs => b.TreeNode(bs) ).Pair); }
public A SumLeft(Monoid <A> m) => FoldLeft(m.Op, m.Id);
public A SumRight(Monoid <A> m) => FoldRight(m.Op, m.Id);
public PairAndMonoid <A, B> Constrain(Monoid <A> m) { return(new PairAndMonoid <A, B>(this, m)); }
internal PairAndMonoid(Pair <A, B> pair, Monoid <A> m) { this.pair = pair; this.m = m; }
public Monoid <A> Monoid(A id) => Monoid <A> .monoid(op, id);
public A SumLeft(Monoid <A> m) { return(FoldLeft <A>(m.Op, m.Id)); }
public Pair <X, NonEmptyList <B> > TraversePair <X, B>(Func <A, Pair <X, B> > f, Monoid <X> m) => f(head).Constrain(m).ZipWith <List <B>, NonEmptyList <B> >(tail.TraversePair(f, m).Constrain(m), h => t => h & t).Pair;
public Monoid <Pair <A, B> > Pair <B>(Monoid <B> s) => Semigroup.Pair(s.Semigroup).Monoid(id.And(s.Id));
public PairAndMonoid <A, B> Constrain(Monoid <A> m) => new PairAndMonoid <A, B>(this, m);
public Pair <X, ListZipper <B> > TraversePair <X, B>(Func <A, Pair <X, B> > f, Monoid <X> m) { var t = this; var r = from ll in lefts.Reverse.TraversePair(f, m).Constrain(m) from xx in f(t.focus).Constrain(m) from rr in t.rights.TraversePair(f, m).Constrain(m) select new ListZipper <B>(ll, xx, rr); return(r.Pair); }
public B SumMapRight <B>(Func <A, B> f, Monoid <B> m) { return(FoldRight <B>((a, b) => m.Op(f(a), b), m.Id)); }
public B SumMapRight <B>(Func <A, B> f, Monoid <B> m) => FoldRight((a, b) => m.Op(f(a), b), m.Id);
public Pair <W, Either <A, X> > TraversePair <W, X>(Func <B, Pair <W, X> > f, Monoid <W> m) { return(Fold(a => m.Id.And(a.Left <A, X>()), b => f(b).Select(x => x.Right <A, X>()))); }
public B SumMapLeft <B>(Func <A, B> f, Monoid <B> m) { return(FoldLeft <B>((a, b) => m.Op(a, f(b)), m.Id)); }
public Pair <X, Input <B> > TraversePair <X, B>(Func <E, Pair <X, B> > f, Monoid <X> m) { return(val.TraversePair(o => o.TraversePair(f, m), m).Select(o => new Input <B>(o))); }
public Monoid <A> Monoid(A id) { return(Monoid <A> .monoid(op, id)); }
public A SumRight(Monoid <A> m) { return(FoldRight <A>(m.Op, m.Id)); }