Skip to content

Instantly share code, notes, and snippets.

@okram
Last active March 17, 2020 08:57
Show Gist options
  • Save okram/70ed04f279f8e5b464cac5fa933045fd to your computer and use it in GitHub Desktop.
Save okram/70ed04f279f8e5b464cac5fa933045fd to your computer and use it in GitHub Desktop.
~/software/mm-adt/vm/jvm bin/mmadt.sh
_____ _______
/\ | __ |__ __|
_ __ ___ _ __ ___ _____ / \ | | | | | |
| '_ ` _ \| '_ ` _ |_____/ /\ \| | | | | |
| | | | | | | | | | | / ____ \ |__| | | |
|_| |_| |_|_| |_| |_| /_/ \_\____/ |_|
mm-adt.org
// the mmkv model guarantees
// * key immutability
// * value immutability
// * exposes index-based lookups on key-equality
mmlang> :model
mmkv ->
mmkv{*}[put,'v',obj] -> mmkv{*}[error,'values are immutable']
mmkv{*}[put,'k',obj] -> mmkv{*}[error,'keys are immutable']
mmkv{*}<=[=mmkv,str<x>][is,bool{*}<=mmkv{*}[get,'k'][eq,int<y>]] -> mmkv{?}<=[=mmkv,str<x>,'getByKeyEq',int<y>]
// when a key/value rec strm is linearly searched, a key-index lookup is used
mmlang> obj{0}[=mmkv,'data/mmkv.mm'][is,[get,'k'][eq,1]]
==>mmkv{?}<=[=mmkv,'data/mmkv.mm','getByKeyEq',1]
// via execution...
mmlang> [=mmkv,'data/mmkv.mm'][is,[get,'k'][eq,1]]
==>['k'->1,'v'->['name'->'marko','age'->29]]
mmlang> [=mmkv,'data/mmkv.mm'][is,[get,'k'][eq,1]][get,'v']
==>['name'->'marko','age'->29]
mmlang> [=mmkv,'data/mmkv.mm'][is,[get,'k'][eq,1]][get,'v'][get,'name']
==>'marko'
// with syntax sugar
mmlang> obj{0}[=mmkv,'data/mmkv.mm'][is.k==1]
==>mmkv{?}<=[=mmkv,'data/mmkv.mm','getByKeyEq',1]
mmlang> [=mmkv,'data/mmkv.mm'][is.k==1].v.name
==>'marko'
@bshambaugh
Copy link

bshambaugh commented Mar 17, 2020

Here are my results:

mmlang> :model
mmkv ->
mmkv{}[put,'v',obj] -> mmkv{}[error,'values are immutable']
mmkv{}[put,'k',obj] -> mmkv{}[error,'keys are immutable']
mmkv{}<=[=mmkv,str][is,bool{}<=mmkv{*}[get,'k'][eq,int]] -> obj{?}<=[=mmkv,str,'getByKeyEq',int]

mmlang> obj{0}[=mmkv,'data/mmkv.mm'][is,[get,'k'][eq,1]]
==>mmkv{*}<=[=mmkv,'data/mmkv.mm','getByKeyEq',1]

mmlang> [=mmkv,'data/mmkv.mm'][is,[get,'k'][eq,1]]
==>[=mmkv,'data/mmkv.mm'][is,[get,'k'][eq,1]]

mmlang> [=mmkv,'data/mmkv.mm'][is,[get,'k'][eq,1]][get,'v']
==>[=mmkv,'data/mmkv.mm'][is,[get,'k'][eq,1]][get,'v']

mmlang> [=mmkv,'data/mmkv.mm'][is,[get,'k'][eq,1]][get,'v'][get,'name']
==>[=mmkv,'data/mmkv.mm'][is,[get,'k'][eq,1]][get,'v'][get,'name']

mmlang> obj{0}[=mmkv,'data/mmkv.mm'][is.k==1]
==>mmkv{*}<=[=mmkv,'data/mmkv.mm','getByKeyEq',1]

mmlang> [=mmkv,'data/mmkv.mm'][is.k==1].v.name
==>[=mmkv,'data/mmkv.mm'][is,[get,'k'][eq,1]][get,'v'][get,'name']

@bshambaugh
Copy link

// via execution
mmlang> 'x'[=mmkv,'data/mmkv.mm'][is,[get,'k'][eq,1]]
==>['k'->1,'v'->['name'->'marko','age'->29]]
mmlang> 'x'[=mmkv,'data/mmkv.mm'][is,[get,'k'][eq,1]][get,'v']
==>['name'->'marko','age'->29]
mmlang> 'x'[=mmkv,'data/mmkv.mm'][is,[get,'k'][eq,1]][get,'v'][get,'name']
==>'marko'

// with syntactic sugar
mmlang> obj{0}[=mmkv,'data/mmkv.mm'][is.k==1]
==>mmkv{*}<=[=mmkv,'data/mmkv.mm','getByKeyEq',1]
mmlang> 'x'[=mmkv,'data/mmkv.mm'][is.k==1].v.name
==>'marko'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment