com.tailoredshapes.stash.Stash Maven / Gradle / Ivy
Show all versions of stash Show documentation
package com.tailoredshapes.stash;
import com.tailoredshapes.underbar.Dates;
import com.tailoredshapes.underbar.UnderBar;
import com.tailoredshapes.underbar.UnderString;
import org.json.simple.JSONAware;
import org.json.simple.JSONValue;
import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.Instant;
import java.util.*;
import java.util.function.*;
import static com.tailoredshapes.underbar.Dates.isoString;
import static com.tailoredshapes.underbar.Die.*;
import static com.tailoredshapes.underbar.UnderBar.*;
import static com.tailoredshapes.underbar.UnderString.urlEncode;
import static java.util.Optional.ofNullable;
/**
* A STring hASH.
*
* All keys are Strings.
*
* With basic functionality for type safe access to members
*/
public class Stash implements JSONAware, Cloneable {
private final Map m = new HashMap<>();
public Stash(Map m) {
each(m, this::update);
}
public Stash() {
}
public Stash(Stash m) {
this(m.m);
}
public static Stash stashFromPairs(Iterable ts, Function> toEntry) {
return new Stash(mapFromEntry(ts, toEntry));
}
public static Stash stashFromKeys(Iterable ks, Function toV) {
return stashFromPairs(ks, k -> entry(k, toV.apply(k)));
}
public static Stash parseJSON(String json) {
return new Stash((Map) dieIfNull(JSONValue.parse(json), () -> "error parsing JSON: " + json));
}
public static Stash stash() {
return new Stash();
}
/**
* Helper methods for creating a stash
*
* @param k1
* @param v1
* @return
*/
public static Stash stash(String k1, Object v1) {
return stash().update(k1, v1);
}
public static Stash stash(String k1, Object v1, String k2, Object v2) {
return stash(k1, v1).update(k2, v2);
}
public static Stash stash(String k1, Object v1, String k2, Object v2, String k3, Object v3) {
return stash(k1, v1, k2, v2).update(k3, v3);
}
public static Stash stash(String k1, Object v1, String k2, Object v2, String k3, Object v3, String k4, Object v4) {
return stash(k1, v1, k2, v2, k3, v3).update(k4, v4);
}
public static Stash stash(String k1, Object v1, String k2, Object v2, String k3, Object v3, String k4, Object v4, String k5, Object v5) {
return stash(k1, v1, k2, v2, k3, v3, k4, v4).update(k5, v5);
}
public static Stash stash(String k1, Object v1, String k2, Object v2, String k3, Object v3, String k4, Object v4, String k5, Object v5, String k6, Object v6) {
return stash(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5).update(k6, v6);
}
public static Stash stash(String k1, Object v1, String k2, Object v2, String k3, Object v3, String k4, Object v4, String k5, Object v5, String k6, Object v6, String k7, Object v7) {
return stash(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6).update(k7, v7);
}
public static Stash stash(String k1, Object v1, String k2, Object v2, String k3, Object v3, String k4, Object v4, String k5, Object v5, String k6, Object v6, String k7, Object v7, String k8, Object v8) {
return stash(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7).update(k8, v8);
}
public static Stash stash(String k1, Object v1, String k2, Object v2, String k3, Object v3, String k4, Object v4, String k5, Object v5, String k6, Object v6, String k7, Object v7, String k8, Object v8, String k9, Object v9) {
return stash(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8).update(k9, v9);
}
public static Stash stash(String k1, Object v1, String k2, Object v2, String k3, Object v3, String k4, Object v4, String k5, Object v5, String k6, Object v6, String k7, Object v7, String k8, Object v8, String k9, Object v9, String k10, Object v10) {
return stash(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9).update(k10, v10);
}
public static Stash stash(String k1, Object v1, String k2, Object v2, String k3, Object v3, String k4, Object v4, String k5, Object v5, String k6, Object v6, String k7, Object v7, String k8, Object v8, String k9, Object v9, String k10, Object v10, String k11, Object v11) {
return stash(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9, k10, v10).update(k11, v11);
}
public static Stash stash(String k1, Object v1, String k2, Object v2, String k3, Object v3, String k4, Object v4, String k5, Object v5, String k6, Object v6, String k7, Object v7, String k8, Object v8, String k9, Object v9, String k10, Object v10, String k11, Object v11, String k12, Object v12) {
return stash(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9, k10, v10, k11, v11).update(k12, v12);
}
public static Stash stash(String k1, Object v1, String k2, Object v2, String k3, Object v3, String k4, Object v4, String k5, Object v5, String k6, Object v6, String k7, Object v7, String k8, Object v8, String k9, Object v9, String k10, Object v10, String k11, Object v11, String k12, Object v12, String k13, Object v13) {
return stash(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9, k10, v10, k11, v11, k12, v12).update(k13, v13);
}
public static Stash stash(String k1, Object v1, String k2, Object v2, String k3, Object v3, String k4, Object v4, String k5, Object v5, String k6, Object v6, String k7, Object v7, String k8, Object v8, String k9, Object v9, String k10, Object v10, String k11, Object v11, String k12, Object v12, String k13, Object v13, String k14, Object v14) {
return stash(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9, k10, v10, k11, v11, k12, v12, k13, v13).update(k14, v14);
}
public static Stash stash(String k1, Object v1, String k2, Object v2, String k3, Object v3, String k4, Object v4, String k5, Object v5, String k6, Object v6, String k7, Object v7, String k8, Object v8, String k9, Object v9, String k10, Object v10, String k11, Object v11, String k12, Object v12, String k13, Object v13, String k14, Object v14, String k15, Object v15) {
return stash(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9, k10, v10, k11, v11, k12, v12, k13, v13, k14, v14).update(k15, v15);
}
public static Stash stash(String k1, Object v1, String k2, Object v2, String k3, Object v3, String k4, Object v4, String k5, Object v5, String k6, Object v6, String k7, Object v7, String k8, Object v8, String k9, Object v9, String k10, Object v10, String k11, Object v11, String k12, Object v12, String k13, Object v13, String k14, Object v14, String k15, Object v15, String k16, Object v16) {
return stash(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9, k10, v10, k11, v11, k12, v12, k13, v13, k14, v14, k15, v15).update(k16, v16);
}
public static Stash stash(String k1, Object v1, String k2, Object v2, String k3, Object v3, String k4, Object v4, String k5, Object v5, String k6, Object v6, String k7, Object v7, String k8, Object v8, String k9, Object v9, String k10, Object v10, String k11, Object v11, String k12, Object v12, String k13, Object v13, String k14, Object v14, String k15, Object v15, String k16, Object v16, String k17, Object v17) {
return stash(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9, k10, v10, k11, v11, k12, v12, k13, v13, k14, v14, k15, v15, k16, v16).update(k17, v17);
}
public static Stash stash(String k1, Object v1, String k2, Object v2, String k3, Object v3, String k4, Object v4, String k5, Object v5, String k6, Object v6, String k7, Object v7, String k8, Object v8, String k9, Object v9, String k10, Object v10, String k11, Object v11, String k12, Object v12, String k13, Object v13, String k14, Object v14, String k15, Object v15, String k16, Object v16, String k17, Object v17, String k18, Object v18) {
return stash(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9, k10, v10, k11, v11, k12, v12, k13, v13, k14, v14, k15, v15, k16, v16, k17, v17).update(k18, v18);
}
public static Stash stash(String k1, Object v1, String k2, Object v2, String k3, Object v3, String k4, Object v4, String k5, Object v5, String k6, Object v6, String k7, Object v7, String k8, Object v8, String k9, Object v9, String k10, Object v10, String k11, Object v11, String k12, Object v12, String k13, Object v13, String k14, Object v14, String k15, Object v15, String k16, Object v16, String k17, Object v17, String k18, Object v18, String k19, Object v19) {
return stash(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9, k10, v10, k11, v11, k12, v12, k13, v13, k14, v14, k15, v15, k16, v16, k17, v17, k18, v18).update(k19, v19);
}
public static Stash stash(String k1, Object v1, String k2, Object v2, String k3, Object v3, String k4, Object v4, String k5, Object v5, String k6, Object v6, String k7, Object v7, String k8, Object v8, String k9, Object v9, String k10, Object v10, String k11, Object v11, String k12, Object v12, String k13, Object v13, String k14, Object v14, String k15, Object v15, String k16, Object v16, String k17, Object v17, String k18, Object v18, String k19, Object v19, String k20, Object v20) {
return stash(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9, k10, v10, k11, v11, k12, v12, k13, v13, k14, v14, k15, v15, k16, v16, k17, v17, k18, v18, k19, v19).update(k20, v20);
}
public static Stash stash(String k1, Object v1, String k2, Object v2, String k3, Object v3, String k4, Object v4, String k5, Object v5, String k6, Object v6, String k7, Object v7, String k8, Object v8, String k9, Object v9, String k10, Object v10, String k11, Object v11, String k12, Object v12, String k13, Object v13, String k14, Object v14, String k15, Object v15, String k16, Object v16, String k17, Object v17, String k18, Object v18, String k19, Object v19, String k20, Object v20, String k21, Object v21) {
return stash(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9, k10, v10, k11, v11, k12, v12, k13, v13, k14, v14, k15, v15, k16, v16, k17, v17, k18, v18, k19, v19, k20, v20).update(k21, v21);
}
/**
* Updates a smash in place
*
* @param k
* @param v
* @return
*/
public Stash update(String k, Object v) {
if (v == null || v.equals(""))
m.put(k, null);
else
m.put(k, v);
return this;
}
public long size() {
return m.size();
}
/**
* Returns a copy of nonce Stash apply new values
*
* @param k
* @param v
* @return
*/
public Stash assoc(String k, Object v) {
return new Stash(this).update(k, v);
}
public Stash dissoc(String k) {
Stash newStash = new Stash(this);
newStash.remove(k);
return newStash;
}
public Number number(String key) {
return getCast(key, x -> (Number) x);
}
public Optional optional(String key) {
return getCast(key, t -> t);
}
public Optional maybe(String key) {
if (!contains(key) || isNull(key)) return UnderBar.optional();
if (type(key) == Optional.class) return optional(key);
return UnderBar.optional(get(key));
}
public T get(String key) {
return getCast(key, x -> x);
}
public T get(String key, Class clazz) {
return getCast(key, x -> x);
}
public T get(String k, T missing) {
return (T) m.getOrDefault(k, missing);
}
//Accessors
public long l(String k) {
return getCast(k, t -> (long) t);
}
public double d(String k) {
return ((Number) getCast(k, x -> x)).doubleValue();
}
public int i(String k) {
return getCast(k, x -> (int) x);
}
public short s(String k) {
return ((Number) getCast(k, x -> x)).shortValue();
}
public float f(String k) {
return ((Number) getCast(k, x -> x)).floatValue();
}
public byte b(String k) {
return ((Number) getCast(k, x -> x)).byteValue();
}
public boolean bool(String k) {
return ((Boolean) getCast(k, x -> x)); //Because you can't use logic on Boolean
}
//Coercion
public long asLong(String k) {
return ((Number) getCast(k, x -> x)).longValue();
}
public int asInteger(String k) {
Number value = getCast(k, x -> (Number) x);
return tap(value.intValue(), result ->
dieUnless(result == value.longValue(), () -> value + " to large for int"));
}
public double asDouble(String k) {
return ((Number) getCast(k, x -> x)).doubleValue();
}
public float asFloat(String k) {
Number value = getCast(k, x -> (Number) x);
return tap(value.floatValue(), result ->
dieUnless(result == value.longValue(), () -> value + " to large for float"));
}
public short asShort(String k) {
Number value = getCast(k, x -> (Number) x);
return tap(value.shortValue(), result ->
dieUnless(result == value.shortValue(), () -> value + " to large for short"));
}
public byte asByte(String k) {
Number value = getCast(k, x -> (Number) x);
return tap(value.byteValue(), result ->
dieUnless(result == value.byteValue(), () -> value + " to large for byte"));
}
public String asString(String k) {
return m.get(k).toString();
}
public Stash asStash(String key) {
return new Stash((Map) getCast(key, x -> x));
}
public List asStashes(String key) {
return UnderBar.map((Collection