---
title: Ref.ts
nav_order: 50
parent: Modules
---

## Ref overview

`Ref` is an abstraction for managing data-driven applications using [Env](./Env.ts.md).

Added in v0.11.0

---

<h2 class="text-delta">Table of contents</h2>

- [Combinator](#combinator)
  - [ap](#ap)
  - [apFirst](#apfirst)
  - [apFirstW](#apfirstw)
  - [apS](#aps)
  - [apSW](#apsw)
  - [apSecond](#apsecond)
  - [apSecondW](#apsecondw)
  - [apT](#apt)
  - [apTW](#aptw)
  - [chainEnvK](#chainenvk)
  - [chainFirstEnvK](#chainfirstenvk)
  - [chainFirstIOK](#chainfirstiok)
  - [chainFirstReaderK](#chainfirstreaderk)
  - [chainFirstResumeK](#chainfirstresumek)
  - [chainFirstTaskK](#chainfirsttaskk)
  - [chainIOK](#chainiok)
  - [chainReaderK](#chainreaderk)
  - [chainResumeK](#chainresumek)
  - [chainTaskK](#chaintaskk)
  - [compose](#compose)
  - [local](#local)
  - [localE](#locale)
  - [map](#map)
  - [promap](#promap)
  - [promapE](#promape)
  - [provideAll](#provideall)
  - [provideSome](#providesome)
  - [struct](#struct)
  - [useAll](#useall)
  - [useSome](#usesome)
- [Constructor](#constructor)
  - [fromKV](#fromkv)
  - [kv](#kv)
- [Instance](#instance)
  - [Apply](#apply)
  - [Functor](#functor)
  - [Profunctor](#profunctor)
  - [Provide](#provide)
  - [ProvideAll](#provideall)
  - [ProvideSome](#providesome)
  - [Semigroupoid](#semigroupoid)
  - [UseAll](#useall)
  - [UseSome](#usesome)
- [Instance Constructor](#instance-constructor)
  - [FromKV](#fromkv)
- [Model](#model)
  - [Ref (interface)](#ref-interface)
- [Type-level](#type-level)
  - [InputOf (type alias)](#inputof-type-alias)
  - [OutputOf (type alias)](#outputof-type-alias)
  - [RequirementsOf (type alias)](#requirementsof-type-alias)
- [Typeclass Constructor](#typeclass-constructor)
  - [getApplySemigroup](#getapplysemigroup)
- [URI](#uri)
  - [URI](#uri-1)
  - [URI (type alias)](#uri-type-alias)

---

# Combinator

## ap

**Signature**

```ts
export declare const ap: <E1, I, A>(
  fa: Ref<E1, I, A>,
) => <E2, B>(fab: Ref<E2, I, (value: A) => B>) => Ref<E1 & E2, I, B>
```

Added in v0.11.0

## apFirst

**Signature**

```ts
export declare const apFirst: <R, E, B>(
  second: Ref<R, E, B>,
) => <A>(first: Ref<R, E, A>) => Ref<R, E, A>
```

Added in v0.11.0

## apFirstW

**Signature**

```ts
export declare const apFirstW: <R1, E, B>(
  second: Ref<R1, E, B>,
) => <R2, A>(first: Ref<R2, E, A>) => Ref<R1 & R2, E, A>
```

Added in v0.11.0

## apS

**Signature**

```ts
export declare const apS: <N, A, R, E, B>(
  name: Exclude<N, keyof A>,
  fb: Ref<R, E, B>,
) => (fa: Ref<R, E, A>) => Ref<R, E, { readonly [K in N | keyof A]: K extends keyof A ? A[K] : B }>
```

Added in v0.11.0

## apSW

**Signature**

```ts
export declare const apSW: <N extends string, A, R1, E, B>(
  name: Exclude<N, keyof A>,
  fb: Ref<R1, E, B>,
) => <R2>(
  fa: Ref<R2, E, A>,
) => Ref<R1 & R2, E, { readonly [K in N | keyof A]: K extends keyof A ? A[K] : B }>
```

Added in v0.11.0

## apSecond

**Signature**

```ts
export declare const apSecond: <R, E, B>(
  second: Ref<R, E, B>,
) => <A>(first: Ref<R, E, A>) => Ref<R, E, B>
```

Added in v0.11.0

## apSecondW

**Signature**

```ts
export declare const apSecondW: <R1, E, B>(
  second: Ref<R1, E, B>,
) => <R2, A>(first: Ref<R2, E, A>) => Ref<R1 & R2, E, B>
```

Added in v0.11.0

## apT

**Signature**

```ts
export declare const apT: <R, E, B>(
  fb: Ref<R, E, B>,
) => <A>(fas: Ref<R, E, A>) => Ref<R, E, readonly [...A, B]>
```

Added in v0.11.0

## apTW

**Signature**

```ts
export declare const apTW: <R1, E, B>(
  fb: Ref<R1, E, B>,
) => <R2, A extends readonly unknown[]>(fas: Ref<R2, E, A>) => Ref<R1 & R2, E, readonly [...A, B]>
```

Added in v0.11.0

## chainEnvK

**Signature**

```ts
export declare function chainEnvK<A, E1, B>(f: (value: A) => E.Env<E1, B>)
```

Added in v0.11.0

## chainFirstEnvK

**Signature**

```ts
export declare function chainFirstEnvK<A, E1, B>(f: (value: A) => E.Env<E1, B>)
```

Added in v0.11.0

## chainFirstIOK

**Signature**

```ts
export declare function chainFirstIOK<A, B>(f: (value: A) => IO<B>)
```

Added in v0.11.0

## chainFirstReaderK

**Signature**

```ts
export declare function chainFirstReaderK<A, E1, B>(f: (value: A) => Reader<E1, B>)
```

Added in v0.11.0

## chainFirstResumeK

**Signature**

```ts
export declare function chainFirstResumeK<A, B>(f: (value: A) => Resume<B>)
```

Added in v0.11.0

## chainFirstTaskK

**Signature**

```ts
export declare function chainFirstTaskK<A, B>(f: (value: A) => Task<B>)
```

Added in v0.11.0

## chainIOK

**Signature**

```ts
export declare function chainIOK<A, B>(f: (value: A) => IO<B>)
```

Added in v0.11.0

## chainReaderK

**Signature**

```ts
export declare function chainReaderK<A, E1, B>(f: (value: A) => Reader<E1, B>)
```

Added in v0.11.0

## chainResumeK

**Signature**

```ts
export declare function chainResumeK<A, B>(f: (value: A) => Resume<B>)
```

Added in v0.11.0

## chainTaskK

**Signature**

```ts
export declare function chainTaskK<A, B>(f: (value: A) => Task<B>)
```

Added in v0.11.0

## compose

**Signature**

```ts
export declare const compose: <E2, A, O>(
  second: Ref<E2, A, O>,
) => <E1, I>(first: Ref<E1, I, A>) => Ref<E1 & E2, I, O>
```

Added in v0.11.0

## local

**Signature**

```ts
export declare const local: <A, B>(f: (value: A) => B) => <E, C>(ref: Ref<E, B, C>) => Ref<E, A, C>
```

Added in v0.11.0

## localE

**Signature**

```ts
export declare const localE: <A, E1, B>(
  f: (value: A) => E.Env<E1, B>,
) => <E2, C>(ref: Ref<E2, B, C>) => Ref<E1 & E2, A, C>
```

Added in v0.12.2

## map

**Signature**

```ts
export declare const map: <A, B>(f: (value: A) => B) => <E, I>(ref: Ref<E, I, A>) => Ref<E, I, B>
```

Added in v0.11.0

## promap

**Signature**

```ts
export declare const promap: <B, A, C, D>(
  f: (value: B) => A,
  g: (value: C) => D,
) => <E>(ref: Ref<E, A, C>) => Ref<E, B, D>
```

Added in v0.11.0

## promapE

**Signature**

```ts
export declare const promapE: <B, E1, A, C, E2, D>(
  f: (value: B) => E.Env<E1, A>,
  g: (value: C) => E.Env<E2, D>,
) => <E3>(ref: Ref<E3, A, C>) => Ref<E1 & E2 & E3, B, D>
```

Added in v0.12.2

## provideAll

**Signature**

```ts
export declare const provideAll: <E>(provided: E) => <A, B>(ref: Ref<E, A, B>) => Ref<unknown, A, B>
```

Added in v0.11.0

## provideSome

**Signature**

```ts
export declare const provideSome: <E1>(
  provided: E1,
) => <E2, A, B>(ref: Ref<E1 & E2, A, B>) => Ref<E2, A, B>
```

Added in v0.11.0

## struct

**Signature**

```ts
export declare function struct<S extends AnyRefStruct>(
  properties: S,
): Ref<RefStructEnv<S>, RefStructInput<S>, RefStructOutput<S>>
```

Added in v0.11.0

## useAll

**Signature**

```ts
export declare const useAll: <E1>(provided: E1) => <A, B>(ref: Ref<E1, A, B>) => Ref<unknown, A, B>
```

Added in v0.11.0

## useSome

**Signature**

```ts
export declare const useSome: <E1>(
  provided: E1,
) => <E2, A, B>(ref: Ref<E1 & E2, A, B>) => Ref<E2, A, B>
```

Added in v0.11.0

# Constructor

## fromKV

**Signature**

```ts
export declare const fromKV: <K, E, A>(kv: KV.KV<K, E, A>) => Ref<E & KV.Env, A, A> & KV.KV<K, E, A>
```

Added in v0.11.0

## kv

**Signature**

```ts
export declare const kv: <E, A, K = symbol>(
  initial: E.Env<E, A>,
  options?: KV.Options<K, A> | undefined,
) => Ref<E & KV.Env, A, A> & KV.KV<K, E, A>
```

Added in v0.11.0

# Instance

## Apply

**Signature**

```ts
export declare const Apply: Ap.Apply3<'@typed/fp/Ref'>
```

Added in v0.11.0

## Functor

**Signature**

```ts
export declare const Functor: Functor3<'@typed/fp/Ref'>
```

Added in v0.11.0

## Profunctor

**Signature**

```ts
export declare const Profunctor: Profunctor3<'@typed/fp/Ref'>
```

Added in v0.11.0

## Provide

**Signature**

```ts
export declare const Provide: P.Provide3<'@typed/fp/Ref'>
```

Added in v0.11.0

## ProvideAll

**Signature**

```ts
export declare const ProvideAll: P.ProvideAll3<'@typed/fp/Ref'>
```

Added in v0.11.0

## ProvideSome

**Signature**

```ts
export declare const ProvideSome: P.ProvideSome3<'@typed/fp/Ref'>
```

Added in v0.11.0

## Semigroupoid

**Signature**

```ts
export declare const Semigroupoid: Semigroupoid3<'@typed/fp/Ref'>
```

Added in v0.11.0

## UseAll

**Signature**

```ts
export declare const UseAll: P.UseAll3<'@typed/fp/Ref'>
```

Added in v0.11.0

## UseSome

**Signature**

```ts
export declare const UseSome: P.UseSome3<'@typed/fp/Ref'>
```

Added in v0.11.0

# Instance Constructor

## FromKV

**Signature**

```ts
export declare const FromKV: FKV.FromKV2<'@typed/fp/Ref', KV.Env>
```

Added in v0.12.0

# Model

## Ref (interface)

**Signature**

```ts
export interface Ref<E, I, O = I> {
  readonly get: E.Env<E, O>
  readonly has: E.Env<E, boolean>
  readonly set: (input: I) => E.Env<E, O>
  readonly update: <E2>(f: (value: O) => E.Env<E2, I>) => E.Env<E & E2, O>
  readonly remove: E.Env<E, O.Option<O>>
  readonly values: RS.ReaderStream<E, O.Option<O>>
}
```

Added in v0.11.0

# Type-level

## InputOf (type alias)

**Signature**

```ts
export type InputOf<A> = [A] extends [Ref<any, infer R, any>] ? R : never
```

Added in v0.11.0

## OutputOf (type alias)

**Signature**

```ts
export type OutputOf<A> = [A] extends [Ref<any, any, infer R>] ? R : never
```

Added in v0.11.0

## RequirementsOf (type alias)

**Signature**

```ts
export type RequirementsOf<A> = [A] extends [Ref<infer R, any, any>] ? R : never
```

Added in v0.11.0

# Typeclass Constructor

## getApplySemigroup

**Signature**

```ts
export declare const getApplySemigroup: <A, R, E>(S: Semigroup<A>) => Semigroup<Ref<R, E, A>>
```

Added in v0.11.0

# URI

## URI

**Signature**

```ts
export declare const URI: '@typed/fp/Ref'
```

Added in v0.11.0

## URI (type alias)

**Signature**

```ts
export type URI = typeof URI
```

Added in v0.11.0
