syndicate-2017/racket/typed/syndicate/either.rkt

36 lines
864 B
Racket
Raw Normal View History

2019-05-24 19:08:08 +00:00
#lang turnstile
(provide Left
Right
Either
left
right
2020-09-24 15:05:55 +00:00
partition/either)
2019-05-24 19:08:08 +00:00
(require "core-types.rkt")
(require "core-expressions.rkt")
(require "for-loops.rkt")
(require "list.rkt")
(define-constructor* (left : Left v))
(define-constructor* (right : Right v))
(define-type-alias (Either A B)
(U (Left A)
(Right B)))
2020-09-24 15:05:55 +00:00
(define ( (X Y Z) (partition/either [xs : (List X)]
2021-05-05 16:52:07 +00:00
[pred : (→fn X (Either Y Z))]
2019-05-24 19:08:08 +00:00
-> (Tuple (List Y) (List Z))))
2020-10-22 20:46:33 +00:00
(for/fold ([lefts (List Y) (list)]
[rights (List Z) (list)])
2019-05-24 19:08:08 +00:00
([x xs])
(define y-or-z (pred x))
(match y-or-z
[(left (bind y Y))
2020-10-22 20:46:33 +00:00
(tuple (cons y lefts)
rights)]
2019-05-24 19:08:08 +00:00
[(right (bind z Z))
2020-10-22 20:46:33 +00:00
(tuple lefts
(cons z rights))])))