Idris2/libs/base/Data/Zippable.idr
2021-02-23 10:54:28 +00:00

58 lines
1.9 KiB
Idris

module Data.Zippable
%default total
---------------------------
-- Zips and unzips --
---------------------------
||| The `Zippable` interface describes how you can combine and split the
||| elements in a parameterised type.
||| @ z the parameterised type
public export
interface Zippable z where
||| Combine two parameterised types by applying a function.
||| @ z the parameterised type
||| @ func the function to combine elements with
zipWith : (func : a -> b -> c) -> z a -> z b -> z c
||| Combine two parameterised types into a parameterised type of pairs.
||| @ z the parameterised type
zip : z a -> z b -> z (a, b)
zip = zipWith (,)
infixr 6 `zip`
||| Combine three parameterised types by applying a function.
||| @ z the parameterised type
||| @ func the function to combine elements with
zipWith3 : (func : a -> b -> c -> d) -> z a -> z b -> z c -> z d
||| Combine three parameterised types into a parameterised type of triplets.
||| @ z the parameterised type
zip3 : z a -> z b -> z c -> z (a, b, c)
zip3 = zipWith3 (,,)
||| Split a parameterised type by applying a function into a pair of
||| parameterised types.
||| @ z the parameterised type
||| @ func the function to split elements with
unzipWith : (func : a -> (b, c)) -> z a -> (z b, z c)
||| Split a parameterised type of pairs into a pair of parameterised types.
||| @ z the parameterised type
unzip : z (a, b) -> (z a, z b)
unzip = unzipWith id
||| Split a parameterised type by applying a function into a triplet of
||| parameterised types.
||| @ z the parameterised type
||| @ func the function to split elements with
unzipWith3 : (func : a -> (b, c, d)) -> z a -> (z b, z c, z d)
||| Split a parameterised type of triplets into a triplet of parameterised
||| types.
||| @ z the parameterised type
unzip3 : z (a, b, c) -> (z a, z b, z c)
unzip3 = unzipWith3 id