diff options
author | Masaya Tojo <masaya@tojo.tokyo> | 2024-06-16 01:58:48 +0900 |
---|---|---|
committer | Masaya Tojo <masaya@tojo.tokyo> | 2024-06-16 01:58:48 +0900 |
commit | 5931a79a5a915035e01b9fb22a3edfde7895e424 (patch) | |
tree | 7704b515651e83db421ee342f02894bfa75557cb /algebraic-structures.private.list.applicative.scm | |
parent | 3f2efd08c5e93b2d20d3f4a32bdfec40a8b14730 (diff) |
Add list implementations
Diffstat (limited to 'algebraic-structures.private.list.applicative.scm')
-rw-r--r-- | algebraic-structures.private.list.applicative.scm | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/algebraic-structures.private.list.applicative.scm b/algebraic-structures.private.list.applicative.scm new file mode 100644 index 0000000..6bbfad7 --- /dev/null +++ b/algebraic-structures.private.list.applicative.scm @@ -0,0 +1,30 @@ +(module (algebraic-structures private list applicative) () + (import scheme + (only (srfi 1) append! reverse!) + (only (chicken base) assert cut) + (only matchable match) + (chicken module)) + (export pure map2) + (reexport (algebraic-structures list functor)) + + (define (pure x) (list x)) + + (define (rev-map f lst) + (let loop ((lst lst) + (acc '())) + (match lst + [() acc] + [(h . t) + (loop t (cons (f h) acc))]))) + + (define (product op lst1 lst2) + (let loop ((lst lst1) + (acc '())) + (match lst + [() (reverse! acc)] + [(h . t) + (loop t + (append! (rev-map (cut op h <>) lst2) + acc))]))) + + (define map2 product)) |