aboutsummaryrefslogtreecommitdiff
path: root/source/lux/data/tuple.lux
blob: 6eef74670cd7a3886b78c37559dfbb248defd4fc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
##  Copyright (c) Eduardo Julian. All rights reserved.
##  This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
##  If a copy of the MPL was not distributed with this file,
##  You can obtain one at http://mozilla.org/MPL/2.0/.

(;import lux)

## [Functions]
(do-template [<name> <type> <output>]
  [(def #export (<name> xy)
     (All [a b] (-> (, a b) <type>))
     (let [[x y] xy]
       <output>))]

  [first  a x]
  [second b y])

(def #export (curry f)
  (All [a b c]
    (-> (-> (, a b) c)
        (-> a b c)))
  (lambda [x y]
    (f [x y])))

(def #export (uncurry f)
  (All [a b c]
    (-> (-> a b c) (-> (, a b) c)))
  (lambda [xy]
    (let [[x y] xy]
      (f x y))))

(def #export (swap xy)
  (All [a b] (-> (, a b) (, b a)))
  (let [[x y] xy]
    [y x]))