diff options
| author | Ben Sima <ben@bsima.me> | 2025-11-20 18:07:12 -0500 |
|---|---|---|
| committer | Ben Sima <ben@bsima.me> | 2025-11-20 18:07:12 -0500 |
| commit | 028bbda4282515b95a7555209d397aaf22d32244 (patch) | |
| tree | 38c5527a546dcb1f877f3380f615ae4497faf50f /Omni/Task/Core.hs | |
| parent | 6e90d59acf45cc481e4e78101a36231af43cbd96 (diff) | |
feat: implement t-PpYZt2
Diffstat (limited to 'Omni/Task/Core.hs')
| -rw-r--r-- | Omni/Task/Core.hs | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/Omni/Task/Core.hs b/Omni/Task/Core.hs index f7b7915..798f8fe 100644 --- a/Omni/Task/Core.hs +++ b/Omni/Task/Core.hs @@ -111,6 +111,28 @@ generateId = do encoded = toBase62 (fromIntegral microseconds) pure <| "t-" <> T.pack encoded +-- Generate a child ID based on parent ID (e.g. "t-abc.1") +generateChildId :: Text -> IO Text +generateChildId parentId = do + tasks <- loadTasks + let children = filter (\t -> taskParent t == Just parentId) tasks + -- Find the max suffix + suffixes = mapMaybe (\t -> getSuffix parentId (taskId t)) children + nextSuffix = case suffixes of + [] -> 1 + s -> maximum s + 1 + pure <| parentId <> "." <> T.pack (show nextSuffix) + +getSuffix :: Text -> Text -> Maybe Int +getSuffix parent childId = + if parent `T.isPrefixOf` childId && T.length childId > T.length parent + then + let rest = T.drop (T.length parent) childId + in if T.head rest == '.' + then readMaybe (T.unpack (T.tail rest)) + else Nothing + else Nothing + -- Convert number to base62 (0-9, a-z, A-Z) toBase62 :: Integer -> String toBase62 0 = "0" @@ -192,7 +214,9 @@ saveTask task = do -- Create a new task createTask :: Text -> TaskType -> Maybe Text -> Maybe Text -> Priority -> [Dependency] -> IO Task createTask title taskType parent namespace priority deps = do - tid <- generateId + tid <- case parent of + Nothing -> generateId + Just pid -> generateChildId pid now <- getCurrentTime let task = Task |
