ansible/dhall/Prelude/List/zip.dhall
2024-11-26 00:55:56 -05:00

58 lines
1.7 KiB
Text

{-|
Zip two `List` into a single `List`
The resulting `List` will have the length of the shortest of its arguments.
-}
let List/index =
missing
sha256:e657b55ecae4d899465c3032cb1a64c6aa6dc2aa3034204f3c15ce5c96c03e63
? ./index.dhall
let zip
: ∀(a : Type) → List a → ∀(b : Type) → List b → List { _1 : a, _2 : b }
= λ(a : Type) →
λ(xs : List a) →
λ(b : Type) →
λ(ys : List b) →
let ixs = List/indexed a xs
in List/build
{ _1 : a, _2 : b }
( λ(list : Type) →
λ(cons : { _1 : a, _2 : b } → list → list) →
λ(nil : list) →
List/fold
{ index : Natural, value : a }
ixs
list
( λ(ix : { index : Natural, value : a }) →
λ(rest : list) →
merge
{ None = rest
, Some =
λ(y : b) → cons { _1 = ix.value, _2 = y } rest
}
(List/index ix.index b ys)
)
nil
)
let example0 =
assert
: zip Text [ "ABC", "DEF", "GHI" ] Natural [ 1, 2, 3 ]
≡ [ { _1 = "ABC", _2 = 1 }
, { _1 = "DEF", _2 = 2 }
, { _1 = "GHI", _2 = 3 }
]
let example1 =
assert
: zip Text [ "ABC" ] Bool ([] : List Bool)
≡ ([] : List { _1 : Text, _2 : Bool })
let example2 =
assert
: zip Text [ "ABC", "DEF", "GHI" ] Natural [ 1 ]
≡ [ { _1 = "ABC", _2 = 1 } ]
in zip