Package

purescript-trivial-unfold

Repository
UnrelatedString/purescript-trivial-unfold
License
BSD-3-Clause
Uploaded by
pacchettibotti
Published on
2025-03-10T20:37:28Z

CI Latest Version Tag Pursuit

A simple library providing a number of utilities for adapting from functions in other libraries with polymorphic forall u. Unfoldable u => a or forall u. Unfoldable1 u => u a result types such as upFrom in purescript-enums, implemented with existentially typed "trivial" wrappers around unfoldr and unfoldr1 calls.

import Effect.Console (logShow)
import Data.Enum (upFrom)
import Data.Maybe (Maybe(..))
import Data.Array (toUnfoldable)
import Data.Foldable (intercalate)
import Data.Monoid (guard)
import Data.Unfoldable (unfoldr1)
import Data.Newtype (ala)
import Data.Multiplicative (Multiplicative(..))

import Data.Unfoldable.Trivial (index, drop, refoldMap1, (::<*>))

main = do

  -- Index into a very large range without evaluating all of it.
  logShow $ index (upFromIncluding 'A') $ 32 + 25
  -- > Just 'z'

  -- Fold over a suffix of an Array without constructing a new Array for
  -- the suffix.
  -- The (::<*>) operator is ($) specialized to Trivial,
  -- and (::<+>) likewise for Trivial1,
  -- to conveniently make instances decidable.
  -- (Note that this can also be accomplished with Data.List.Lazy.)
  logShow $ intercalate " " ::<*> drop 2 $ toUnfoldable [
    "I'm", "never", "gonna", "give", "you", "up"
  ]
  -- > "gonna give you up"

  -- Fold directly from a generating function.
  -- Basic folds are also provided specialized, with the "re-" prefix;
  -- i.e. `refoldMap1 Multiplicative $ unfoldr1 fact 1` is equivalent to
  --      `foldMap1 Multiplicative ::<+> unfoldr1 fact 1`.
  let fact n = n /\ (guard (n < 6) $> n + 1)
  logShow $ ala Multiplicative refoldMap1 $ unfoldr1 fact 1
  -- > 620
spago install trivial-unfold

Module documentation is published on Pursuit.