mirror of
https://github.com/fiddlerwoaroof/data-lens.git
synced 2025-11-08 10:16: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
|
||||
|
||||
# Controls when the workflow will run
|
||||
on:
|
||||
# Triggers the workflow on push or pull request events but only for the master branch
|
||||
push:
|
||||
branches: [ master ]
|
||||
pull_request:
|
||||
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:
|
||||
# This workflow contains a single job called "build"
|
||||
build:
|
||||
runs-on: ubuntu-20.04
|
||||
# The type of runner that the job will run on
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||
- uses: actions/checkout@v2
|
||||
- name: Docker Setup QEMU
|
||||
uses: docker/setup-qemu-action@v1.0.1
|
||||
|
||||
- uses: cachix/install-nix-action@v15
|
||||
with:
|
||||
platforms: arm64
|
||||
- name: Run a one-line script
|
||||
run: make test
|
||||
extra_nix_config: |
|
||||
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
# 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
|
||||
*.*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:
|
||||
docker build . --tag data-lens-transducer-test
|
||||
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))
|
||||
(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)
|
||||
(lambda (data)
|
||||
(cl-ppcre:scan-to-strings regex data)))
|
||||
@ -269,10 +275,16 @@
|
||||
(apply ,fsym ,@args ,seq)))))
|
||||
|
||||
(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))
|
||||
(key (functionalize key)))
|
||||
(lambda (it)
|
||||
(funcall fun (funcall key it)))))
|
||||
(lambda (&rest its)
|
||||
(funcall fun (mapcar key its)))))
|
||||
|
||||
(defun filler (length1 length2 fill-value)
|
||||
(if (< length1 length2)
|
||||
@ -311,6 +323,20 @@
|
||||
it
|
||||
(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
|
||||
(defmacro <> (arity &rest funs)
|
||||
(let ((arg-syms (loop repeat arity collect (gensym))))
|
||||
|
||||
35
package.lisp
35
package.lisp
@ -6,35 +6,36 @@
|
||||
(defpackage :data-lens.lenses
|
||||
(:shadow :set)
|
||||
(:use :cl)
|
||||
(:export :over :set :view :make-alist-lens :make-plist-lens :make-hash-table-lens
|
||||
:make-list-lens))
|
||||
(:export #:over #:set #:view #:make-alist-lens #:make-plist-lens
|
||||
#:make-hash-table-lens #:make-list-lens))
|
||||
|
||||
(defpackage :data-lens
|
||||
(:use :cl)
|
||||
(:import-from #:serapeum #:op #:defalias)
|
||||
(:export #:regex-match #:include #:exclude #:pick #:key-transform
|
||||
#:combine #:derive #:cumsum #:over #:on #:shortcut #:defun-ct #:key
|
||||
#:extract-key #:element #:let-fn #:juxt #:transform-tail #:slice
|
||||
#:compress-runs #:combine-matching-lists #:sorted #:applicable-when
|
||||
#:combine #:derive #:cumsum #:over #:on #:shortcut
|
||||
#:defun-ct #:key #:extract-key #:element #:let-fn #:juxt
|
||||
#:transform-tail #:slice #:compress-runs
|
||||
#:combine-matching-lists #:sorted #:applicable-when
|
||||
#:of-length #:of-min-length #:of-max-length #:transform-head
|
||||
#:maximizing #:zipping #:applying #:splice-elt #:transform-elt #:denest
|
||||
#:op #:defalias #:<> #:<>1 #:== #:• #:suffixp #:functionalize
|
||||
#:inc))
|
||||
#:maximizing #:zipping #:applying #:splice-elt
|
||||
#:transform-elt #:denest #:op #:defalias #:<> #:<>1 #:== #:•
|
||||
#:suffixp #:functionalize #:inc #:group-by #:keys))
|
||||
|
||||
(defpackage :data-lens.transducers.internals
|
||||
(:use :cl)
|
||||
(:export #:unwrap #:init #:reduce-generic #:stepper #:transduce
|
||||
#:exit-early #:into #:builder-for-input))
|
||||
#:exit-early #:into
|
||||
#:builder-for-input))
|
||||
|
||||
(defpackage :data-lens.transducers
|
||||
(:use :cl)
|
||||
(:import-from :data-lens.transducers.internals
|
||||
(:import-from #:data-lens.transducers.internals
|
||||
#:unwrap #:init #:reduce-generic #:stepper #:transduce
|
||||
#:exit-early #:into)
|
||||
(:export #:mapping :filtering :deduping :catting :splitting
|
||||
#:exit-early :taking :dropping :transduce
|
||||
#:hash-table-builder :vector-builder :list-builder
|
||||
#:collecting #:mv-mapping #:mv-selecting
|
||||
#:hash-table-select #:mv-filtering #:mapcatting
|
||||
#:lazy-sequence #:compressing-runs #:iota
|
||||
#:repeating #:repeating* #:into))
|
||||
(:export #:mapping #:filtering #:deduping #:catting #:splitting
|
||||
#:exit-early #:taking #:dropping #:transduce
|
||||
#:hash-table-builder #:vector-builder #:list-builder
|
||||
#:collecting #:mv-mapping #:mv-selecting :hash-table-select
|
||||
#:mv-filtering #:mapcatting :lazy-sequence
|
||||
#:compressing-runs #:iota :repeating #:repeating* #:into))
|
||||
|
||||
Reference in New Issue
Block a user