cat/instances/comonad

Comonad instances: Identity, NonEmpty, Tuple, Pair, and Reader.

Values

pub fn identity_comonad() -> comonad.Comonad(
  types.IdentityF,
  a,
  b,
  cat.Identity(a),
  cat.Identity(b),
  cat.Identity(cat.Identity(a)),
)

Comonad instance for Identity.

Examples

let double = fn(id: Identity(Int)) -> Int {
  let Identity(x) = id
  x * 2
}
Identity(5)
|> identity_comonad().extend(double)
// -> Identity(10)
pub fn non_empty_comonad() -> comonad.Comonad(
  types.NonEmptyF,
  a,
  b,
  cat.NonEmpty(a),
  cat.NonEmpty(b),
  cat.NonEmpty(cat.NonEmpty(a)),
)

Comonad instance for NonEmpty.

Examples

Next("a", Next("b", Leaf("c")))
|> non_empty_comonad().duplicate()
// -> Next(Next("a", Next("b", Leaf("c"))),
//    Next(Next("b", Leaf("c")), 
//    Leaf(Leaf("c")))

fn sum(vec: NonEmpty(Int)) -> Int {
  case vec {
    Leaf(x) -> x
    Next(x, v) -> x + sum(v)
  }
}

Next(1, Next(2, Next(3, Leaf(4))))
|> non_empty_comonad().extend(sum)
// -> Next(10, Next(9, Next(7, Leaf(4))))
pub fn tuple_comonad() -> comonad.Comonad(
  types.TupleF(c),
  a,
  b,
  #(c, a),
  #(c, b),
  #(c, #(c, a)),
)

Comonad instance for Tuple.

Examples

#("hello", 5)
|> tuple_comonad().extract()

// -> 5
#("hello", 5)
|> tuple_comonad().duplicate()
// -> #("hello", #("hello", 5))

#("hello", 5)
|> tuple_comonad().extend(fn(p: #(String, Int)) { length(p.0) == p.1 })
// -> #("hello", True)
✨ Search Document