View Source Funx.List (funx v0.1.0)

The Funx.List module provides utility functions for working with lists while respecting Eq and Ord instances. This allows for set-like operations, uniqueness constraints, and sorted collections that align with functional programming principles.

Features

  • Equality-based Operations: Use Eq instances to compare elements for uniqueness, intersection, and difference.
  • Ordering Functions: Leverage Ord instances to sort and enforce uniqueness in sorted collections.
  • Set Operations: Perform union, intersection, difference, and symmetric difference while preserving custom equality logic.
  • Subset & Superset Checks: Verify relationships between lists in terms of inclusion.
  • Functional Constructs: Implements Monad and Foldable protocols for lists, supporting mapping, binding, and folding.

Usage Overview

  1. Deduplicate: Use uniq/1 to remove duplicates based on Eq.
  2. Combine: Use union/2 to merge lists without duplicates.
  3. Filter: Use intersection/2 or difference/2 for set operations.
  4. Sort: Use sort/2 or strict_sort/2 with Ord instances.
  5. Check Membership: Use subset?/2 or superset?/2 to verify inclusion relationships.

Equality-Based Operations

Ordering Functions

Set Operations

  • subset?/2: Checks if one list is a subset of another.
  • superset?/2: Checks if one list is a superset of another.

Monad Implementation

  • map/2: Transforms list elements.
  • bind/2: Applies a function returning lists and flattens the result.
  • ap/2: Applies functions in a list to elements in another list.

Foldable Implementation

  • fold_l/3: Performs left-associative folding.
  • fold_r/3: Performs right-associative folding.

Summary

Functions

Concatenates a list of lists from left to right.

Returns the difference of two lists.

Returns the intersection of two lists.

Sorts a list using the given ordering module.

Sorts a list while ensuring uniqueness.

Checks if the first list is a subset of the second.

Checks if the first list is a superset of the second.

Returns the symmetric difference of two lists.

Returns the union of two lists, removing duplicates.

Removes duplicate elements from a list based on the given equality module.

Functions

@spec concat([[term()]]) :: [term()]

Concatenates a list of lists from left to right.

This uses the ListConcat monoid, preserving the original order of elements.

Examples

iex> Funx.List.concat([[1], [2, 3], [4]])
[1, 2, 3, 4]
Link to this function

difference(list1, list2, eq \\ Funx.Eq)

View Source
@spec difference([term()], [term()], Funx.Eq.Utils.eq_t()) :: [term()]

Returns the difference of two lists.

Examples

iex> Funx.List.difference([1, 2, 3, 4], [3, 4, 5])
[1, 2]
Link to this function

intersection(list1, list2, eq \\ Funx.Eq)

View Source
@spec intersection([term()], [term()], Funx.Eq.Utils.eq_t()) :: [term()]

Returns the intersection of two lists.

Examples

iex> Funx.List.intersection([1, 2, 3, 4], [3, 4, 5])
[3, 4]
Link to this function

sort(list, ord \\ Funx.Ord)

View Source
@spec sort([term()], Funx.Ord.Utils.ord_t()) :: [term()]

Sorts a list using the given ordering module.

Examples

iex> Funx.List.sort([3, 1, 4, 1, 5])
[1, 1, 3, 4, 5]
Link to this function

strict_sort(list, ord \\ Funx.Ord)

View Source
@spec strict_sort([term()], Funx.Ord.Utils.ord_t()) :: [term()]

Sorts a list while ensuring uniqueness.

Examples

iex> Funx.List.strict_sort([3, 1, 4, 1, 5])
[1, 3, 4, 5]
Link to this function

subset?(small, large, eq \\ Funx.Eq)

View Source
@spec subset?([term()], [term()], Funx.Eq.Utils.eq_t()) :: boolean()

Checks if the first list is a subset of the second.

Examples

iex> Funx.List.subset?([1, 2], [1, 2, 3, 4])
true

iex> Funx.List.subset?([1, 5], [1, 2, 3, 4])
false
Link to this function

superset?(large, small, eq \\ Funx.Eq)

View Source
@spec superset?([term()], [term()], Funx.Eq.Utils.eq_t()) :: boolean()

Checks if the first list is a superset of the second.

Examples

iex> Funx.List.superset?([1, 2, 3, 4], [1, 2])
true

iex> Funx.List.superset?([1, 2, 3, 4], [1, 5])
false
Link to this function

symmetric_difference(list1, list2, eq \\ Funx.Eq)

View Source
@spec symmetric_difference([term()], [term()], Funx.Eq.Utils.eq_t()) :: [term()]

Returns the symmetric difference of two lists.

Examples

iex> Funx.List.symmetric_difference([1, 2, 3], [3, 4, 5])
[1, 2, 4, 5]
Link to this function

union(list1, list2, eq \\ Funx.Eq)

View Source
@spec union([term()], [term()], Funx.Eq.Utils.eq_t()) :: [term()]

Returns the union of two lists, removing duplicates.

Examples

iex> Funx.List.union([1, 2, 3], [3, 4, 5])
[1, 2, 3, 4, 5]
Link to this function

uniq(list, eq \\ Funx.Eq)

View Source
@spec uniq([term()], Funx.Eq.Utils.eq_t()) :: [term()]

Removes duplicate elements from a list based on the given equality module.

Examples

iex> Funx.List.uniq([1, 2, 2, 3, 1, 4, 5])
[1, 2, 3, 4, 5]