mirror of
https://github.com/correl/calrissian.git
synced 2024-11-23 11:09:58 +00:00
Maybe
This commit is contained in:
commit
615d427fa8
12 changed files with 325 additions and 0 deletions
10
.gitignore
vendored
Normal file
10
.gitignore
vendored
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
deps
|
||||||
|
*.sublime-project
|
||||||
|
*.sublime-workspace
|
||||||
|
*.beam
|
||||||
|
.eunit
|
||||||
|
debug-*
|
||||||
|
ebin/*
|
||||||
|
bin/expm
|
||||||
|
*.dump
|
||||||
|
.rebar
|
9
.travis.yml
Normal file
9
.travis.yml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
language: erlang
|
||||||
|
script: "make check-travis"
|
||||||
|
notifications:
|
||||||
|
#irc: "irc.freenode.org#YOUR-PROJECT-CHANNEL"
|
||||||
|
recipients:
|
||||||
|
#- YOU@YOUR.DOMAIN
|
||||||
|
otp_release:
|
||||||
|
- R16B03
|
||||||
|
- R15B03
|
1
Makefile
Normal file
1
Makefile
Normal file
|
@ -0,0 +1 @@
|
||||||
|
include common.mk
|
55
README.rst
Normal file
55
README.rst
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
###########
|
||||||
|
maybe
|
||||||
|
###########
|
||||||
|
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
============
|
||||||
|
|
||||||
|
Add content to me here!
|
||||||
|
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
------------
|
||||||
|
|
||||||
|
This project assumes that you have `rebar`_ installed somwhere in your
|
||||||
|
``$PATH``.
|
||||||
|
|
||||||
|
This project depends upon the following, which are installed to the ``deps``
|
||||||
|
directory of this project when you run ``make deps``:
|
||||||
|
|
||||||
|
* `LFE`_ (Lisp Flavored Erlang; needed only to compile)
|
||||||
|
* `lfeunit`_ (needed only to run the unit tests)
|
||||||
|
|
||||||
|
|
||||||
|
Installation
|
||||||
|
============
|
||||||
|
|
||||||
|
Just add it to your ``rebar.config`` deps:
|
||||||
|
|
||||||
|
.. code:: erlang
|
||||||
|
|
||||||
|
{deps, [
|
||||||
|
...
|
||||||
|
{maybe, ".*", {git, "git@github.com:YOURNAME/maybe.git", "master"}}
|
||||||
|
]}.
|
||||||
|
|
||||||
|
|
||||||
|
And then do the usual:
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
$ rebar get-deps
|
||||||
|
$ rebar compile
|
||||||
|
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=====
|
||||||
|
|
||||||
|
Add content to me here!
|
||||||
|
|
||||||
|
.. Links
|
||||||
|
.. -----
|
||||||
|
.. _rebar: https://github.com/rebar/rebar
|
||||||
|
.. _LFE: https://github.com/rvirding/lfe
|
||||||
|
.. _lfeunit: https://github.com/lfe/lfeunit
|
107
common.mk
Normal file
107
common.mk
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
PROJECT = maybe
|
||||||
|
LIB = $(PROJECT)
|
||||||
|
DEPS = ./deps
|
||||||
|
BIN_DIR = ./bin
|
||||||
|
EXPM = $(BIN_DIR)/expm
|
||||||
|
LFETOOL=$(BIN_DIR)/lfetool
|
||||||
|
SOURCE_DIR = ./src
|
||||||
|
OUT_DIR = ./ebin
|
||||||
|
TEST_DIR = ./test
|
||||||
|
TEST_OUT_DIR = ./.eunit
|
||||||
|
SCRIPT_PATH=.:./bin:$(PATH):/usr/local/bin
|
||||||
|
|
||||||
|
$(BIN_DIR):
|
||||||
|
mkdir -p $(BIN_DIR)
|
||||||
|
|
||||||
|
$(LFETOOL): $(BIN_DIR)
|
||||||
|
@[ -f $(LFETOOL) ] || \
|
||||||
|
curl -o ./lfetool https://raw.github.com/lfe/lfetool/master/lfetool && \
|
||||||
|
chmod 755 ./lfetool && \
|
||||||
|
mv ./lfetool $(BIN_DIR)
|
||||||
|
|
||||||
|
get-version:
|
||||||
|
@PATH=$(SCRIPT_PATH) lfetool info version
|
||||||
|
|
||||||
|
$(EXPM): $(BIN_DIR)
|
||||||
|
@[ -f $(EXPM) ] || \
|
||||||
|
PATH=$(SCRIPT_PATH) lfetool install expm $(BIN_DIR)
|
||||||
|
|
||||||
|
get-deps:
|
||||||
|
@echo "Getting dependencies ..."
|
||||||
|
@rebar get-deps
|
||||||
|
@PATH=$(SCRIPT_PATH) lfetool update deps
|
||||||
|
|
||||||
|
clean-ebin:
|
||||||
|
@echo "Cleaning ebin dir ..."
|
||||||
|
@rm -f $(OUT_DIR)/*.beam
|
||||||
|
|
||||||
|
clean-eunit:
|
||||||
|
@PATH=$(SCRIPT_PATH) lfetool tests clean
|
||||||
|
|
||||||
|
compile: get-deps clean-ebin
|
||||||
|
@echo "Compiling project code and dependencies ..."
|
||||||
|
@rebar compile
|
||||||
|
|
||||||
|
compile-no-deps: clean-ebin
|
||||||
|
@echo "Compiling only project code ..."
|
||||||
|
@rebar compile skip_deps=true
|
||||||
|
|
||||||
|
compile-tests:
|
||||||
|
@PATH=$(SCRIPT_PATH) lfetool tests build
|
||||||
|
|
||||||
|
shell: compile
|
||||||
|
@clear
|
||||||
|
@echo "Starting shell ..."
|
||||||
|
@PATH=$(SCRIPT_PATH) lfetool repl lfe
|
||||||
|
|
||||||
|
shell-no-deps: compile-no-deps
|
||||||
|
@clear
|
||||||
|
@echo "Starting shell ..."
|
||||||
|
@PATH=$(SCRIPT_PATH) lfetool repl
|
||||||
|
|
||||||
|
clean: clean-ebin clean-eunit
|
||||||
|
@rebar clean
|
||||||
|
|
||||||
|
check-unit-only:
|
||||||
|
@PATH=$(SCRIPT_PATH) lfetool tests unit
|
||||||
|
|
||||||
|
check-integration-only:
|
||||||
|
@PATH=$(SCRIPT_PATH) lfetool tests integration
|
||||||
|
|
||||||
|
check-system-only:
|
||||||
|
@PATH=$(SCRIPT_PATH) lfetool tests system
|
||||||
|
|
||||||
|
check-unit-with-deps: get-deps compile compile-tests check-unit-only
|
||||||
|
check-unit: compile-no-deps check-unit-only
|
||||||
|
check-integration: compile check-integration-only
|
||||||
|
check-system: compile check-system-only
|
||||||
|
check-all-with-deps: compile check-unit-only check-integration-only \
|
||||||
|
check-system-only
|
||||||
|
check-all: get-deps compile-no-deps
|
||||||
|
@PATH=$(SCRIPT_PATH) lfetool tests all
|
||||||
|
|
||||||
|
check: check-unit-with-deps
|
||||||
|
|
||||||
|
check-travis: $(LFETOOL) check
|
||||||
|
|
||||||
|
push-all:
|
||||||
|
@echo "Pusing code to github ..."
|
||||||
|
git push --all
|
||||||
|
git push upstream --all
|
||||||
|
git push --tags
|
||||||
|
git push upstream --tags
|
||||||
|
|
||||||
|
install: compile
|
||||||
|
@echo "Installing maybe ..."
|
||||||
|
@PATH=$(SCRIPT_PATH) lfetool install lfe
|
||||||
|
|
||||||
|
upload: $(EXPM) get-version
|
||||||
|
@echo "Preparing to upload maybe ..."
|
||||||
|
@echo
|
||||||
|
@echo "Package file:"
|
||||||
|
@echo
|
||||||
|
@cat package.exs
|
||||||
|
@echo
|
||||||
|
@echo "Continue with upload? "
|
||||||
|
@read
|
||||||
|
$(EXPM) publish
|
2
include/maybe.lfe
Normal file
2
include/maybe.lfe
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
(defmacro do statements
|
||||||
|
(maybe:do-statement statements))
|
2
include/maybe.lfe~
Normal file
2
include/maybe.lfe~
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
(defmacro do statements
|
||||||
|
`(maybe:do-statement ',statements))
|
7
package.exs
Normal file
7
package.exs
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
Expm.Package.new(
|
||||||
|
name: "maybe",
|
||||||
|
description: "maybe DESCRIPTION",
|
||||||
|
version: "0.0.1",
|
||||||
|
keywords: ["LFE", "Lisp", "Library", "API"],
|
||||||
|
maintainers: [[name: "YOUR NAME", email: "YOUR@EMAIL.com"]],
|
||||||
|
repositories: [[github: "YOUR_GITHUB_NAME/maybe]])
|
20
rebar.config
Normal file
20
rebar.config
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
{erl_opts, [debug_info, {src_dirs, ["test/unit",
|
||||||
|
"test/integration",
|
||||||
|
"test/system"]}]}.
|
||||||
|
{lfe_first_files, []}.
|
||||||
|
{deps_dir, ["deps"]}.
|
||||||
|
{plugins, ['lfe-sample-rebar-plugin']}.
|
||||||
|
{eunit_compile_opts, [
|
||||||
|
{src_dirs, ["test/unit",
|
||||||
|
"test/integration",
|
||||||
|
"test/system",
|
||||||
|
"src"]}
|
||||||
|
]}.
|
||||||
|
{deps, [
|
||||||
|
{lfe, ".*", {git, "git://github.com/rvirding/lfe.git", "develop"}},
|
||||||
|
{'lfe-utils', ".*", {git, "https://github.com/lfe/lfe-utils.git", "master"}},
|
||||||
|
{lfeunit, ".*", {git, "git://github.com/lfe/lfeunit.git", "master"}},
|
||||||
|
{'lfe-sample-rebar-plugin',
|
||||||
|
".*", {git, "git://github.com/oubiwann/lfe-sample-rebar-plugin.git",
|
||||||
|
"master"}}
|
||||||
|
]}.
|
37
src/maybe.app.src
Normal file
37
src/maybe.app.src
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
%% -*- erlang -*-
|
||||||
|
{application, 'maybe',
|
||||||
|
[
|
||||||
|
%% A quick description of the application.
|
||||||
|
{description, "My project description..."},
|
||||||
|
|
||||||
|
%% The version of the application
|
||||||
|
{vsn, "0.0.1"},
|
||||||
|
|
||||||
|
%% All modules used by the application.
|
||||||
|
{modules,
|
||||||
|
[
|
||||||
|
'maybe'
|
||||||
|
]},
|
||||||
|
|
||||||
|
%% All of the registered names the application uses. This can be ignored.
|
||||||
|
{registered, []},
|
||||||
|
|
||||||
|
%% Applications that are to be started prior to this one. This can be ignored
|
||||||
|
%% leave it alone unless you understand it well and let the .rel files in
|
||||||
|
%% your release handle this.
|
||||||
|
{applications,
|
||||||
|
[
|
||||||
|
kernel,
|
||||||
|
stdlib
|
||||||
|
]},
|
||||||
|
|
||||||
|
%% OTP application loader will load, but not start, included apps. Again
|
||||||
|
%% this can be ignored as well. To load but not start an application it
|
||||||
|
%% is easier to include it in the .rel file followed by the atom 'none'
|
||||||
|
{included_applications, []},
|
||||||
|
|
||||||
|
%% configuration parameters similar to those in the config file specified
|
||||||
|
%% on the command line. can be fetched with gas:get_env
|
||||||
|
{env, []}
|
||||||
|
]
|
||||||
|
}.
|
31
src/maybe.lfe
Normal file
31
src/maybe.lfe
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
(defmodule maybe
|
||||||
|
(export all))
|
||||||
|
|
||||||
|
(defun my-adder (x y)
|
||||||
|
(+ x (+ y 1)))
|
||||||
|
|
||||||
|
(defun >>=
|
||||||
|
(('nothing f)
|
||||||
|
'nothing)
|
||||||
|
(((tuple 'just x) f)
|
||||||
|
(funcall f x)))
|
||||||
|
|
||||||
|
(defun >> (a b)
|
||||||
|
(>>= a (lambda (_) b)))
|
||||||
|
|
||||||
|
(defun return (x) (tuple 'just x))
|
||||||
|
(defun fail (_) 'nothing)
|
||||||
|
|
||||||
|
;; (defmacro do statements
|
||||||
|
;; `(lists:foldl >>= (car statements) (cdr statements)))
|
||||||
|
|
||||||
|
;; (defmacro do statements
|
||||||
|
;; `'(list ,@statements))
|
||||||
|
|
||||||
|
(defun do-statement
|
||||||
|
(((cons h '())) h)
|
||||||
|
(((cons (list f '<- m) t)) (list ': 'maybe '>>=
|
||||||
|
m
|
||||||
|
(list 'lambda (list f) (do-statement t))))
|
||||||
|
(((cons h t)) (list 'lambda '(_) (do-statement t)))
|
||||||
|
)
|
44
test/unit/unit-maybe-tests.lfe
Normal file
44
test/unit/unit-maybe-tests.lfe
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
(defmodule unit-maybe-tests
|
||||||
|
(export all)
|
||||||
|
(import
|
||||||
|
(from lfeunit-util
|
||||||
|
(check-failed-assert 2)
|
||||||
|
(check-wrong-assert-exception 2))))
|
||||||
|
|
||||||
|
(include-lib "deps/lfeunit/include/lfeunit-macros.lfe")
|
||||||
|
(include-lib "include/maybe.lfe")
|
||||||
|
|
||||||
|
(deftest bind-nothing
|
||||||
|
(is-equal 'nothing
|
||||||
|
(maybe:>>= 'nothing
|
||||||
|
(lambda (x) (+ 5 x)))))
|
||||||
|
|
||||||
|
(deftest bind-nothing-error
|
||||||
|
(is-equal 'nothing
|
||||||
|
(maybe:>>= 'nothing
|
||||||
|
(lambda (_) (error 'bad-func)))))
|
||||||
|
|
||||||
|
(deftest bind-five
|
||||||
|
(is-equal 10
|
||||||
|
(maybe:>>= (tuple 'just 5)
|
||||||
|
(lambda (x) (+ 5 x)))))
|
||||||
|
|
||||||
|
(deftest bind-fold
|
||||||
|
(is-equal #(just 3)
|
||||||
|
(let ((minc (lambda (x) (maybe:return (+ 1 x))))
|
||||||
|
(bind (lambda (f m) (maybe:>>= m f))))
|
||||||
|
(lists:foldr bind
|
||||||
|
#(just 0)
|
||||||
|
(list minc
|
||||||
|
minc
|
||||||
|
minc)))))
|
||||||
|
|
||||||
|
(deftest >>
|
||||||
|
(is-equal #(just 3)
|
||||||
|
(maybe:>> #(just 5) #(just 3))))
|
||||||
|
|
||||||
|
(deftest do
|
||||||
|
(is-equal #(just 3)
|
||||||
|
(do (a <- #(just 1))
|
||||||
|
(b <- #(just 2))
|
||||||
|
(maybe:return (+ a b)))))
|
Loading…
Reference in a new issue