join: update library paths, install to new location
[hcoop/portal.git] / util.sml
index a0a649c..9c269c1 100644 (file)
--- a/util.sml
+++ b/util.sml
@@ -29,8 +29,12 @@ fun makeSet f items =
 
 fun neg (r : real) = ~r
 fun add (r1 : real, r2) = r1 + r2
+fun sub (r1 : real, r2) = r1 - r2
 fun mult (r1, r2) = real r1 * r2
 
+fun lt (r1 : real, r2) = r1 < r2
+fun ge (r1 : real, r2) = r1 >= r2
+
 fun isIdent ch = Char.isLower ch orelse Char.isDigit ch orelse ch = #"-"
 
 fun validHost s =
@@ -64,7 +68,7 @@ fun init () = rnd := Random.rand (SysWord.toInt (Posix.Process.pidToWord (Posix.
 fun randomPassword () = Int.toString (Int.abs (Random.randInt (!rnd)))
 
 fun domainDir dom =
-    String.concatWith "/" ("/etc/domains" :: String.fields (fn ch => ch = #".") dom)
+    String.concatWith "/" ("/afs/hcoop.net/common/etc/domtool/nodes/deleuze" :: List.rev (String.fields (fn ch => ch = #".") dom))
 
 fun readFile fname =
     let
@@ -83,4 +87,26 @@ fun mem (x, ls) = List.exists (fn y => y = x) ls
 
 val allLower = CharVector.map Char.toLower
 
+fun normEmail s = case String.tokens Char.isSpace (allLower s) of
+                     s :: _ => s
+                   | [] => ""
+
+val s_cutoff = LargeInt.fromInt 60
+val m_cutoff = LargeInt.fromInt (60 * 60)
+val h_cutoff = LargeInt.fromInt (60 * 60 * 24)
+
+fun diffFromNow t =
+    let
+       val secs = Time.toSeconds (Time.- (Time.now (), t))
+    in
+       if LargeInt.< (secs, s_cutoff) then
+           LargeInt.toString secs ^ " seconds"
+       else if LargeInt.< (secs, m_cutoff) then
+           LargeInt.toString (LargeInt.div (secs, s_cutoff)) ^ " minutes"
+       else if LargeInt.< (secs, h_cutoff) then
+           LargeInt.toString (LargeInt.div (secs, m_cutoff)) ^ " hours"
+       else
+           LargeInt.toString (LargeInt.div (secs, h_cutoff)) ^ " days"
+    end
+
 end