mirror of
https://github.com/fiddlerwoaroof/data-lens.git
synced 2025-11-08 18:26:32 +00:00
Compare commits
12 Commits
c80aff0f0b
...
f517e52845
| Author | SHA1 | Date | |
|---|---|---|---|
| f517e52845 | |||
| f20effc399 | |||
| 96a8ea5ee6 | |||
| bf86c538a1 | |||
| 011ddea2de | |||
| 725744a4e0 | |||
| fa22323fa8 | |||
| e694886196 | |||
| 6776568df3 | |||
| 702332c031 | |||
| f75af164ea | |||
| 858bd9d2ff |
40
.github/workflows/test.yml
vendored
40
.github/workflows/test.yml
vendored
@ -1,20 +1,48 @@
|
|||||||
name: CI
|
name: CI
|
||||||
|
|
||||||
|
# Controls when the workflow will run
|
||||||
on:
|
on:
|
||||||
|
# Triggers the workflow on push or pull request events but only for the master branch
|
||||||
push:
|
push:
|
||||||
branches: [ master ]
|
branches: [ master ]
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [ master ]
|
branches: [ master ]
|
||||||
|
|
||||||
|
# Allows you to run this workflow manually from the Actions tab
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
||||||
jobs:
|
jobs:
|
||||||
|
# This workflow contains a single job called "build"
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-20.04
|
# The type of runner that the job will run on
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- name: Docker Setup QEMU
|
|
||||||
uses: docker/setup-qemu-action@v1.0.1
|
- uses: cachix/install-nix-action@v15
|
||||||
with:
|
with:
|
||||||
platforms: arm64
|
extra_nix_config: |
|
||||||
- name: Run a one-line script
|
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
|
||||||
run: make test
|
|
||||||
|
# Runs a set of commands using the runners shell
|
||||||
|
- name: setup deps
|
||||||
|
run: |
|
||||||
|
nix profile install nixpkgs\#sbcl
|
||||||
|
cd
|
||||||
|
wget 'https://beta.quicklisp.org/quicklisp.lisp'
|
||||||
|
sbcl --eval '(require :uiop)' \
|
||||||
|
--load quicklisp.lisp \
|
||||||
|
--eval '(handler-case (progn (error "fail!") (quicklisp-quickstart:install)) (error () (uiop:quit 40)))' \
|
||||||
|
--quit
|
||||||
|
|
||||||
|
- name: run tests
|
||||||
|
run: |
|
||||||
|
cd "$GITHUB_WORKSPACE"
|
||||||
|
sbcl --load "$HOME/quicklisp/setup.lisp" \
|
||||||
|
--eval "(mapcar 'asdf:load-asd (directory \"*.asd\"))" \
|
||||||
|
--eval "(ql:quickload :data-lens/transducers/test)" \
|
||||||
|
--eval "(asdf:test-system :data-lens/transducers/test)" \
|
||||||
|
--quit
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,4 +1,3 @@
|
|||||||
*.fasl
|
*.fasl
|
||||||
*.*x*fsl
|
*.*x*fsl
|
||||||
*~
|
*~
|
||||||
.*.sw?
|
|
||||||
|
|||||||
4
Makefile
4
Makefile
@ -1,7 +1,3 @@
|
|||||||
load_no_trans:
|
|
||||||
docker build . --tag data-lens-transducer-test
|
|
||||||
docker run data-lens-transducer-test --eval "(asdf:test-system :data-lens)" --quit
|
|
||||||
|
|
||||||
test:
|
test:
|
||||||
docker build . --tag data-lens-transducer-test
|
docker build . --tag data-lens-transducer-test
|
||||||
docker run data-lens-transducer-test --eval "(asdf:test-system :data-lens/beta/transducers)" --quit
|
docker run data-lens-transducer-test --eval "(asdf:test-system :data-lens/beta/transducers)" --quit
|
||||||
|
|||||||
30
lens.lisp
30
lens.lisp
@ -125,6 +125,12 @@
|
|||||||
(declare (dynamic-extent map))
|
(declare (dynamic-extent map))
|
||||||
(extract-key map key)))
|
(extract-key map key)))
|
||||||
|
|
||||||
|
(defun keys (key &rest keys)
|
||||||
|
(lambda (map)
|
||||||
|
(loop for key in (cons key keys)
|
||||||
|
for cur = (extract-key map key) then (extract-key cur key)
|
||||||
|
finally (return cur))))
|
||||||
|
|
||||||
(defun-ct regex-match (regex)
|
(defun-ct regex-match (regex)
|
||||||
(lambda (data)
|
(lambda (data)
|
||||||
(cl-ppcre:scan-to-strings regex data)))
|
(cl-ppcre:scan-to-strings regex data)))
|
||||||
@ -269,10 +275,16 @@
|
|||||||
(apply ,fsym ,@args ,seq)))))
|
(apply ,fsym ,@args ,seq)))))
|
||||||
|
|
||||||
(defun-ct on (fun key)
|
(defun-ct on (fun key)
|
||||||
|
"Transform arguments with KEY and then apply FUN
|
||||||
|
|
||||||
|
> (eql (funcall (on 'equal 'car)
|
||||||
|
> '(\"a\" 1 2)
|
||||||
|
> '(\"a\" 2 e))
|
||||||
|
> t)"
|
||||||
(let ((fun (functionalize fun))
|
(let ((fun (functionalize fun))
|
||||||
(key (functionalize key)))
|
(key (functionalize key)))
|
||||||
(lambda (it)
|
(lambda (&rest its)
|
||||||
(funcall fun (funcall key it)))))
|
(funcall fun (mapcar key its)))))
|
||||||
|
|
||||||
(defun filler (length1 length2 fill-value)
|
(defun filler (length1 length2 fill-value)
|
||||||
(if (< length1 length2)
|
(if (< length1 length2)
|
||||||
@ -311,6 +323,20 @@
|
|||||||
it
|
it
|
||||||
(alexandria:iota it-length))))))))
|
(alexandria:iota it-length))))))))
|
||||||
|
|
||||||
|
(defun-ct group-by (fn &key (test 'equal))
|
||||||
|
(lambda (seq)
|
||||||
|
(let ((groups (make-hash-table :test test)))
|
||||||
|
(map nil
|
||||||
|
(lambda (it)
|
||||||
|
(push it
|
||||||
|
(gethash (funcall fn it)
|
||||||
|
groups)))
|
||||||
|
seq)
|
||||||
|
(mapcar (lambda (it)
|
||||||
|
(cons (car it)
|
||||||
|
(reverse (cdr it))))
|
||||||
|
(alexandria:hash-table-alist groups)))))
|
||||||
|
|
||||||
#+nil
|
#+nil
|
||||||
(defmacro <> (arity &rest funs)
|
(defmacro <> (arity &rest funs)
|
||||||
(let ((arg-syms (loop repeat arity collect (gensym))))
|
(let ((arg-syms (loop repeat arity collect (gensym))))
|
||||||
|
|||||||
35
package.lisp
35
package.lisp
@ -6,35 +6,36 @@
|
|||||||
(defpackage :data-lens.lenses
|
(defpackage :data-lens.lenses
|
||||||
(:shadow :set)
|
(:shadow :set)
|
||||||
(:use :cl)
|
(:use :cl)
|
||||||
(:export :over :set :view :make-alist-lens :make-plist-lens :make-hash-table-lens
|
(:export #:over #:set #:view #:make-alist-lens #:make-plist-lens
|
||||||
:make-list-lens))
|
#:make-hash-table-lens #:make-list-lens))
|
||||||
|
|
||||||
(defpackage :data-lens
|
(defpackage :data-lens
|
||||||
(:use :cl)
|
(:use :cl)
|
||||||
(:import-from #:serapeum #:op #:defalias)
|
(:import-from #:serapeum #:op #:defalias)
|
||||||
(:export #:regex-match #:include #:exclude #:pick #:key-transform
|
(:export #:regex-match #:include #:exclude #:pick #:key-transform
|
||||||
#:combine #:derive #:cumsum #:over #:on #:shortcut #:defun-ct #:key
|
#:combine #:derive #:cumsum #:over #:on #:shortcut
|
||||||
#:extract-key #:element #:let-fn #:juxt #:transform-tail #:slice
|
#:defun-ct #:key #:extract-key #:element #:let-fn #:juxt
|
||||||
#:compress-runs #:combine-matching-lists #:sorted #:applicable-when
|
#:transform-tail #:slice #:compress-runs
|
||||||
|
#:combine-matching-lists #:sorted #:applicable-when
|
||||||
#:of-length #:of-min-length #:of-max-length #:transform-head
|
#:of-length #:of-min-length #:of-max-length #:transform-head
|
||||||
#:maximizing #:zipping #:applying #:splice-elt #:transform-elt #:denest
|
#:maximizing #:zipping #:applying #:splice-elt
|
||||||
#:op #:defalias #:<> #:<>1 #:== #:• #:suffixp #:functionalize
|
#:transform-elt #:denest #:op #:defalias #:<> #:<>1 #:== #:•
|
||||||
#:inc))
|
#:suffixp #:functionalize #:inc #:group-by #:keys))
|
||||||
|
|
||||||
(defpackage :data-lens.transducers.internals
|
(defpackage :data-lens.transducers.internals
|
||||||
(:use :cl)
|
(:use :cl)
|
||||||
(:export #:unwrap #:init #:reduce-generic #:stepper #:transduce
|
(:export #:unwrap #:init #:reduce-generic #:stepper #:transduce
|
||||||
#:exit-early #:into #:builder-for-input))
|
#:exit-early #:into
|
||||||
|
#:builder-for-input))
|
||||||
|
|
||||||
(defpackage :data-lens.transducers
|
(defpackage :data-lens.transducers
|
||||||
(:use :cl)
|
(:use :cl)
|
||||||
(:import-from :data-lens.transducers.internals
|
(:import-from #:data-lens.transducers.internals
|
||||||
#:unwrap #:init #:reduce-generic #:stepper #:transduce
|
#:unwrap #:init #:reduce-generic #:stepper #:transduce
|
||||||
#:exit-early #:into)
|
#:exit-early #:into)
|
||||||
(:export #:mapping :filtering :deduping :catting :splitting
|
(:export #:mapping #:filtering #:deduping #:catting #:splitting
|
||||||
#:exit-early :taking :dropping :transduce
|
#:exit-early #:taking #:dropping #:transduce
|
||||||
#:hash-table-builder :vector-builder :list-builder
|
#:hash-table-builder #:vector-builder #:list-builder
|
||||||
#:collecting #:mv-mapping #:mv-selecting
|
#:collecting #:mv-mapping #:mv-selecting :hash-table-select
|
||||||
#:hash-table-select #:mv-filtering #:mapcatting
|
#:mv-filtering #:mapcatting :lazy-sequence
|
||||||
#:lazy-sequence #:compressing-runs #:iota
|
#:compressing-runs #:iota :repeating #:repeating* #:into))
|
||||||
#:repeating #:repeating* #:into))
|
|
||||||
|
|||||||
Reference in New Issue
Block a user