 
 
 (defn logShift [shift loglevel & anyMsg]
-  {:pre [(assumedLogLevel loglevel)
-         (assumedShift shift)
+  {:pre [(assumedValidLogLevel loglevel)
+         (assumedValidShift shift)
          ]}
   (apply showHere (addAndIgnoreNil shift 3) loglevel anyMsg)
   )
 
 
 (defn logCaller [loglevel & anyMsg ]
-  {:pre [(assumedLogLevel loglevel)]}
+  {:pre [(assumedValidLogLevel loglevel)]}
   (apply logShift 4 loglevel anyMsg)
   )
 
 (defn log [loglevel & anyMsg]
-  {:pre [(assumedLogLevel loglevel)]}
+  {:pre [(assumedValidLogLevel loglevel)]}
   (apply logShift 0 loglevel anyMsg)
   )
 

rest = strings to be joined with space between them; or nil to skip
"
  [& [shift loglevel  :as all]]
  (showLocation (let [msg (nthrest all 2)]
                  (cond (empty? msg)
                    (priv_functionget)

     )
  )

;TODO:something like (or x 1) but we check x against some invariants if it's non-truthy
#_(defn fallback
  [original & fallbacks]
  
  )

(defn assumedValidIfPresent [validityfn presentfn thing & failmsg]
  {:pre [(assumedTrue 
           [
            (ifn? validityfn)
            "you didn't pass a valid ifn? as validityfn"
            "you passed `"
            validityfn
            "`"
            ]
           [
            (ifn? presentfn)
            "you didn't pass a valid ifn? as presentfn"
            "you passed `"
            presentfn
            "`"
            ]
           )]}
  (cond (presentfn thing)
    (assumedTrue [(validityfn thing)
                  failmsg])
    :else
    ;not-present, not checked and return true
    true
    )
  )

(defn assumedValidLogLevel [loglevel]
  (assumedTrue [
                (keyword? loglevel)
                "loglevel must be a keyword ie. :info or :debug"
