> For the complete documentation index, see [llms.txt](https://marblejs.gitbook.io/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://marblejs.gitbook.io/docs/v3/other/api-reference/core/r.pipe.md).

# r.pipe

HttpEffect route builder based on IxMonad

## **Importing**

```typescript
import { r } from '@marblejs/core';
```

## `pipe`

`r` namespace function. Creates pipeable *RouteEffect* builder.

### **Type declaration**

```typescript
pipe :: ...Arity<IxBuilder, IxBuilder> -> RouteEffect
```

{% hint style="danger" %}
`r.pipe` builder pays attention to the order of applied operators.
{% endhint %}

```typescript
const example$ = r.pipe(
  r.matchPath('/'),
  r.matchType('GET'),
  r.use(middleware_1$),
  r.useEffect(req$ => req$.pipe(
    // ...
  )),
  r.use(middleware_2$), // ❌ type error!
);

// or 

const example$ = r.pipe(
  r.matchType('GET'),
  r.matchPath('/'), // ❌ type error!
  r.use(middleware_1$),
  r.use(middleware_2$), 
  r.useEffect(req$ => req$.pipe(
    // ...
  )),
);
```

**Correct order:**

1. **`<optional> applyMeta`**
2. **`matchPath`**
3. **`matchType`**
4. **`use`** \[...]
5. **`useEffect`**
6. **`applyMeta`** \[...]

## **`matchPath`**

`r` namespace function. Matches request path for connected *HttpEffect*.

### **Type declaration**

```typescript
matchPath :: string -> IxBuilder -> IxBuilder
```

### **Parameters**

| *parameter* | definition |
| ----------- | ---------- |
| *path*      | `string`   |

## **`matchType`**

`r` namespace function. Matches HTTP method type for connected *HttpEffect*.

### **Type declaration**

```typescript
matchType :: HttpMethod -> IxBuilder -> IxBuilder
```

### **Parameters**

| *parameter* | definition   |
| ----------- | ------------ |
| *path*      | `HttpMethod` |

## `use`

`r` namespace function. Registers HTTP middleware with connected *HttpEffect.*

### **Type declaration**

```typescript
use :: HttpMiddlewareEffect -> IxBuilder -> IxBuilder
```

### **Parameters**

| *parameter*  | definition             |
| ------------ | ---------------------- |
| *middleware* | `HttpMiddlewareEffect` |

## `useEffect`

`r` namespace function. Registers *HttpEffect.*

### **Type declaration**

```typescript
useEffect :: HttpEffect -> IxBuilder -> IxBuilder
```

### **Parameters**

| *parameter* | definition   |
| ----------- | ------------ |
| *effect*    | `HttpEffect` |

## `applyMeta`

`r` namespace function. Applies metadata to connected *HttpEffect*.

### **Type declaration**

```typescript
applyMeta :: RouteMeta -> IxBuilder -> IxBuilder
```

### **Parameters**

| *parameter* | definition  |
| ----------- | ----------- |
| meta        | `RouteMeta` |

`RouteMeta` attributes:

| parameter     | type                  | definition                                                 |
| ------------- | --------------------- | ---------------------------------------------------------- |
| `name`        | \<optional> `string`  | route/effect name                                          |
| `continuous`  | \<optional> `boolean` | enables [continuous mode](/docs/v3/http/advanced/modes.md) |
| `overridable` | \<optional> `boolean` | if true, the route can be overrode by another route        |

## Example

```typescript
import { r } from '@marblejs/core';

const example$ = r.pipe(
  r.applyMeta({ continuous: true }),
  r.matchPath('/'),
  r.matchType('GET'),
  r.use(middleware_1$),
  r.use(middleware_2$),
  r.useEffect(req$ => req$.pipe(
    // ...
  )),
  r.applyMeta({ meta_1: /* ... */ }),
  r.applyMeta({ meta_1: /* ... */ }),
);
```
