pipe

package
v0.2.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 4, 2026 License: MIT Imports: 12 Imported by: 0

Documentation

Overview

Package pipe is an orch recipe: typed linear pipeline with per-Push Result.

Build with FromJob / FromUniversalJobs, then NodeOrch.Then, NodeOrch.Parallel, NodeOrch.EndJob / NodeOrch.EndJobs, and Builder.Build. Lifecycle:

Build → Run → Push* → Close

Scheduler matches schedx.RetrievableScheduler in shape. Admission uses a RetrievableScheduler whose Job injects into stage pumps (chanx) and waits on a ticket until Tail or failure. Scheduler.Pending is admission queue depth, not in-stage count. Scheduler.Close fails unfinished Results immediately and stops stage pumps.

Node jobs are TransformJob / TransformFunc (In → Out). Parallel stages fan out UniversalTransformJob and merge with a summary. This package does not re-export chanx.

Code generated by genx:code@v0.3.7 DO NOT EDIT.

Index

Examples

Constants

View Source
const (
	Lifetime_Orchestrating = iota + int32(0)
	Lifetime_Orchestrated
	Lifetime_Building
	Lifetime_Built
	Lifetime_Running
	Lifetime_Closed
)

Variables

This section is empty.

Functions

func IsPipelineError added in v0.2.2

func IsPipelineError(err error) bool

func IsShutdown added in v0.2.2

func IsShutdown(err error) bool

func IsTaskError added in v0.2.2

func IsTaskError(err error) bool

Types

type Builder added in v0.2.2

type Builder[Head, Tail any] struct {
	// contains filtered or unexported fields
}

func (*Builder[Head, Tail]) Build added in v0.2.2

func (b *Builder[Head, Tail]) Build(fs ...OptionFunc) Scheduler[Head, Tail]

type Error added in v0.2.2

type Error uint8

Error defines error codes in pipe +genx:code

const (
	ERROR_UNDEFINED Error = iota
	ERROR__PIPELINE_NOT_RUNNING
	ERROR__REACH_MAX_PENDING
	ERROR__PIPELINE_CANCELED

	ERROR__JOB_FAILED
	ERROR__JOB_CANCELED
	ERROR__PIPELINE_JOB_PANICKED
	ERROR__PIPELINE_SUMMARY_PANICKED
)

func (Error) Message added in v0.2.2

func (e Error) Message() string

type Node

type Node interface {
	Name() string
	// contains filtered or unexported methods
}

type NodeOrch added in v0.2.2

type NodeOrch[Head, Tail, Last any] struct {
	// contains filtered or unexported fields
}

func FromJob added in v0.2.2

func FromJob[Head, Tail, Next any](
	name string,
	job TransformJob[Head, Next],
) *NodeOrch[Head, Tail, Next]
Example

ExampleFromJob shows Build → Run → Push → Result → Close.

package main

import (
	"context"
	"fmt"
	"sort"
	"time"

	"github.com/xoctopus/x/slicex"

	"github.com/xoctopus/concx/pkg/orch/pipe"
)

func main() {
	ctx := context.Background()

	p := pipe.FromJob[string, string, string](
		"initializing",
		pipe.TransformFunc[string, string](func(_ context.Context, in string) (string, error) {
			fmt.Println("initializing:", in)
			return in, nil
		}),
	).Parallel[[]string](
		"dag",
		func(in string, outs ...any) []string {
			return slicex.Mapping(outs, func(v any) string { return v.(string) })
		},
		pipe.TransformFunc[string, any](func(_ context.Context, in string) (any, error) {
			fmt.Println("dag-a node:", in)
			return "dag-a-result", nil
		}),
		pipe.TransformFunc[string, any](func(_ context.Context, in string) (any, error) {
			fmt.Println("dag-b node:", in)
			return "dag-b-result", nil
		}),
	).EndJob(
		"summary",
		pipe.TransformFunc[[]string, string](func(_ context.Context, res []string) (string, error) {
			sort.Strings(res)
			fmt.Println("summary:", res)
			return "finished", nil
		}),
	).Build(
		pipe.WithMaxPending(2),
		pipe.WithShutdownTimeout(time.Second),
	)

	_ = p.Run(ctx)
	defer func() { _ = p.Close() }()

	for _, name := range []string{"first", "second"} {
		ret, _ := p.Push(ctx, name)
		res, _ := ret.Result(ctx)
		fmt.Println(res, name)
	}

}
Output:
initializing: first
dag-a node: first
dag-b node: first
summary: [dag-a-result dag-b-result]
finished first
initializing: second
dag-a node: second
dag-b node: second
summary: [dag-a-result dag-b-result]
finished second

func FromUniversalJobs added in v0.2.2

func FromUniversalJobs[Head, Tail, Next any](
	name string,
	summary func(in Head, outs ...any) Next,
	jobs ...UniversalTransformJob[Head],
) *NodeOrch[Head, Tail, Next]

func (*NodeOrch[Head, Tail, Last]) EndJob added in v0.2.2

func (o *NodeOrch[Head, Tail, Last]) EndJob(
	name string,
	job TransformJob[Last, Tail],
) *Builder[Head, Tail]

func (*NodeOrch[Head, Tail, Last]) EndJobs added in v0.2.2

func (o *NodeOrch[Head, Tail, Last]) EndJobs(
	name string,
	summary func(in Last, outs ...any) Tail,
	jobs ...UniversalTransformJob[Last],
) *Builder[Head, Tail]

func (*NodeOrch[Head, Tail, Last]) Parallel added in v0.2.2

func (o *NodeOrch[Head, Tail, Last]) Parallel[Next any](
	name string,
	summary func(in Last, outs ...any) Next,
	jobs ...UniversalTransformJob[Last],
) *NodeOrch[Head, Tail, Next]

func (*NodeOrch[Head, Tail, Last]) Then added in v0.2.2

func (o *NodeOrch[Head, Tail, Last]) Then[Next any](
	name string,
	job TransformJob[Last, Next],
) *NodeOrch[Head, Tail, Next]

type OptionFunc added in v0.2.2

type OptionFunc func(*option)

func WithMaxPending added in v0.2.2

func WithMaxPending(maxPending int) OptionFunc

func WithParallel added in v0.2.2

func WithParallel(n int) OptionFunc

WithParallel sets how many pipeline tickets may run concurrently (RetrievableScheduler worker count). Each in-flight ticket holds a worker until Tail or failure.

func WithShutdownTimeout added in v0.2.2

func WithShutdownTimeout(timeout time.Duration) OptionFunc

type ParallelNode added in v0.2.2

type ParallelNode[Head, Tail, I, O any] struct {
	// contains filtered or unexported fields
}

func (*ParallelNode[Head, Tail, I, O]) Name added in v0.2.2

func (n *ParallelNode[Head, Tail, I, O]) Name() string

type Result added in v0.2.2

type Result[R any] = schedx.Result[R]

Result is the completion handle returned by Scheduler.Push.

type Scheduler added in v0.2.2

type Scheduler[Head, Tail any] interface {
	Push(context.Context, Head) (Result[Tail], error)
	Pending() int
	Close() error
	Run(context.Context) error
}

Scheduler is the runnable pipeline surface. Shape matches schedx.RetrievableScheduler; runtime is RetrievableScheduler plus stage pumps (nodes / finale) and chanx shutdown.

type SimpleNode added in v0.2.2

type SimpleNode[Head, Tail, I, O any] struct {
	// contains filtered or unexported fields
}

func (*SimpleNode[Head, Tail, I, O]) Name added in v0.2.2

func (n *SimpleNode[Head, Tail, I, O]) Name() string

type Summary added in v0.2.2

type Summary[I, O any] func(I, ...any) O

type TransformFunc added in v0.2.2

type TransformFunc[In, Out any] func(context.Context, In) (Out, error)

func (TransformFunc[In, Out]) Do added in v0.2.2

func (f TransformFunc[In, Out]) Do(ctx context.Context, in In) (Out, error)

type TransformJob added in v0.2.2

type TransformJob[In, Out any] interface {
	Do(ctx context.Context, in In) (Out, error)
}

type UniversalTransformJob added in v0.2.2

type UniversalTransformJob[In any] = TransformJob[In, any]

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL