summaryrefslogtreecommitdiff
path: root/Omni/Task
diff options
context:
space:
mode:
authorBen Sima <ben@bsima.me>2025-11-20 18:39:25 -0500
committerBen Sima <ben@bsima.me>2025-11-20 18:39:25 -0500
commitfeda8ac221d88650850a3eaac2fbe2f2b215beac (patch)
tree331bcc0b1e5e32cffb8ebcc784d59428f42b163c /Omni/Task
parent0d8ba7ec8b7b06a490eb7f2d625e169b2ed0ad72 (diff)
feat: implement t-PpYZt2
Diffstat (limited to 'Omni/Task')
-rw-r--r--Omni/Task/Core.hs17
1 files changed, 11 insertions, 6 deletions
diff --git a/Omni/Task/Core.hs b/Omni/Task/Core.hs
index 54ed04d..525ceb4 100644
--- a/Omni/Task/Core.hs
+++ b/Omni/Task/Core.hs
@@ -13,7 +13,8 @@ import qualified Data.ByteString.Lazy.Char8 as BLC
import qualified Data.List as List
import qualified Data.Text as T
import qualified Data.Text.IO as TIO
-import Data.Time (UTCTime, diffTimeToPicoseconds, getCurrentTime, utctDayTime)
+import Data.Time (UTCTime, diffTimeToPicoseconds, getCurrentTime, utctDayTime, utctDay)
+import Data.Time.Calendar (toModifiedJulianDay)
import GHC.Generics ()
import System.Directory (createDirectoryIfMissing, doesFileExist)
import System.Environment (lookupEnv)
@@ -104,11 +105,15 @@ initTaskDb = do
generateId :: IO Text
generateId = do
now <- getCurrentTime
- -- Convert current time to microseconds since midnight
- let dayTime = utctDayTime now
- microseconds = diffTimeToPicoseconds dayTime `div` 1000000
- -- Convert to base62 for shorter IDs
- encoded = toBase62 (fromIntegral microseconds)
+ -- Convert current time to microseconds since epoch (using MJD)
+ let day = utctDay now
+ dayTime = utctDayTime now
+ mjd = toModifiedJulianDay day
+ micros = diffTimeToPicoseconds dayTime `div` 1000000
+ -- Combine MJD and micros to ensure uniqueness across days.
+ -- Multiplier 10^11 (100,000 seconds) is safe for any day length.
+ totalMicros = (mjd * 100000000000) + micros
+ encoded = toBase62 totalMicros
pure <| "t-" <> T.pack encoded
-- Generate a child ID based on parent ID (e.g. "t-abc.1", "t-abc.1.2")