# Functor

``public protocol Functor : Invariant``

A Functor provides a type with the ability to transform its value type into another type, while preserving its structure.

Using the encoding for HKTs in Bow, in the type `Kind<F, A>`, `A` is the value type and `F` represents the structure of the type. An instance of `Functor` for `F` allows to transform `A` into another type, while maintaining `F` unchanged.

• ``` map(_:_:) ``` Default implementation

Creates a new value transforming the type using the provided function, preserving the structure of the original type.

The implementation of this function must obey two laws:

1. Preserve identity:

``````map(fa, id) == fa
``````
2. Preserve composition:

``````map(map(fa, f), g) == map(fa, compose(g, f))
``````

#### Default Implementation

Creates a new value transforming the type using the provided key path, preserving the structure of the original type.

#### Declaration

Swift

``static func map<A, B>(_ fa: Kind<Self, A>, _ f: @escaping (A) -> B) -> Kind<Self, B>``

#### Parameters

 ``` fa ``` A value in the context of the type implementing this instance of `Functor`. ``` f ``` A transforming function.

#### Return Value

The result of transforming the value type using the provided function, maintaining the structure of the original value.

• ``` hylo(_:_:_:) ``` Extension method

Undocumented

#### Declaration

Swift

``````static func hylo<A, B>(_ algebra : @escaping Algebra<Self, Eval<B>>,
_ coalgebra : @escaping Coalgebra<Self, A>,
_ a : A) -> B``````
• ``` imap(_:_:_:) ``` Extension method

#### Declaration

Swift

``static func imap<A, B>(_ fa: Kind<Self, A>, _ f: @escaping (A) -> B, _ g: @escaping (B) -> A) -> Kind<Self, B>``
• ``` lift(_:) ``` Extension method

Given a function, provides a new function lifted to the context type implementing this instance of `Functor`.

#### Declaration

Swift

``static func lift<A, B>(_ f: @escaping (A) -> B) -> (Kind<Self, A>) -> Kind<Self, B>``

#### Parameters

 ``` f ``` Function to be lifted.

#### Return Value

Function in the context implementing this instance of `Functor`.

• ``` void(_:) ``` Extension method

Replaces the value type by the `Void` type.

#### Declaration

Swift

``static func void<A>(_ fa: Kind<Self, A>) -> Kind<Self, ()>``

#### Parameters

 ``` fa ``` Value to be transformed.

#### Return Value

New value in the context implementing this instance of `Functor`, with `Void` as value type.

• ``` fproduct(_:_:) ``` Extension method

Transforms the value type and pairs it with its original value.

#### Declaration

Swift

``static func fproduct<A, B>(_ fa: Kind<Self, A>, _ f: @escaping (A) -> B) -> Kind<Self, (A, B)>``

#### Parameters

 ``` fa ``` Value to be transformed. ``` f ``` Transforming function.

#### Return Value

A pair with the original value and its transformation, in the context of the original value.

• ``` as(_:_:) ``` Extension method

Transforms the value type with a constant value.

#### Declaration

Swift

``static func `as`<A, B>(_ fa: Kind<Self, A>, _ b: B) -> Kind<Self, B>``

#### Parameters

 ``` fa ``` Value to be transformed. ``` b ``` Constant value to replace the value type.

#### Return Value

A new value with the structure of the original value, with its value type transformed.

• ``` tupleLeft(_:_:) ``` Extension method

Transforms the value type by making a tuple with a new constant value to the left of the original value type.

#### Declaration

Swift

``static func tupleLeft<A, B>(_ fa: Kind<Self, A>, _ b: B) -> Kind<Self, (B, A)>``

#### Parameters

 ``` fa ``` Value to be transformed. ``` b ``` Constant value for the tuple.

#### Return Value

A new value with the structure of the original value, with a tuple in its value type.

• ``` tupleRight(_:_:) ``` Extension method

Transforms the value type by making a tuple with a new constant value to the right of the original value type.

#### Declaration

Swift

``static func tupleRight<A, B>(_ fa: Kind<Self, A>, _ b: B) -> Kind<Self, (A, B)>``

#### Parameters

 ``` fa ``` Value to be transformed. ``` b ``` Constant value for the tuple.

#### Return Value

A new value with the structure of the original value, with a tuple in its value type.