Splitting a problem into two smaller problems of about
equal size is a common approach. Do this for lists by moving
list elements alternatingly into two sublists.

Signed-off-by: Klaus Aehlig <[email protected]>
---
 src/Ganeti/Utils.hs | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/src/Ganeti/Utils.hs b/src/Ganeti/Utils.hs
index fbe3a36..46cfc67 100644
--- a/src/Ganeti/Utils.hs
+++ b/src/Ganeti/Utils.hs
@@ -4,7 +4,7 @@
 
 {-
 
-Copyright (C) 2009, 2010, 2011, 2012, 2013 Google Inc.
+Copyright (C) 2009, 2010, 2011, 2012, 2013, 2015 Google Inc.
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -44,6 +44,7 @@ module Ganeti.Utils
   , applyIf
   , commaJoin
   , ensureQuoted
+  , divideList
   , tryRead
   , readMaybe
   , formatTable
@@ -209,6 +210,12 @@ ensureQuoted v = if not (all (\c -> isAlphaNum c || c == 
'.') v)
 threadDelaySeconds :: Int -> IO ()
 threadDelaySeconds = threadDelay . (*) 1000000
 
+-- | Split a list into two lists of approximately the same length.
+divideList :: [a] -> ([a], [a])
+divideList [] = ([], [])
+divideList [a] = ([a], [])
+divideList (a:b:xs) = let (ls, rs) = divideList xs in (a:ls, b:rs)
+
 -- * Mathematical functions
 
 -- Simple and slow statistical functions, please replace with better
-- 
2.6.0.rc2.230.g3dd15c0

Reply via email to