Difference between revisions of "Data.List.Split"

From HaskellWiki
Jump to: navigation, search
(create Data.List.Split)
 
Line 2: Line 2:
   
 
Add your implementations below! Once we converge on something good we can upload it to hackage.
 
Add your implementations below! Once we converge on something good we can upload it to hackage.
  +
  +
<haskell>
  +
{-# LANGUAGE ViewPatterns #-}
  +
  +
import Data.List (unfoldr)
  +
  +
  +
-- intercalate :: [a] -> [[a]] -> [a]
  +
-- intercalate x [a,b,c,x,y,z] = [a,x,b,x,c,x,x,y,x,z,x]
  +
  +
-- unintercalate :: [a] -> [[a]] -> [a]
  +
-- unintercalate x [a,x,b,x,c,x,x,y,x,z,x] = [a,b,c,[],y,z]
  +
  +
-- unintercalate is the "inverse" of intercalate
  +
  +
match [] string = Just string
  +
match (_:_) [] = Nothing
  +
match (p:ps) (q:qs) | p == q = match ps qs
  +
match (_:_) (_:_) | otherwise = Nothing
  +
  +
chopWith delimiter (match delimiter -> Just tail) = return ([], tail)
  +
chopWith delimiter (c:cs) = chopWith delimiter cs >>= \(head, tail) ->
  +
return (c:head, tail)
  +
chopWith delimiter [] = Nothing
  +
  +
unintercalate delimiter = unfoldr (chopWith delimiter)
  +
  +
-- > unintercalate "x" "axbxcxxyxzx"
  +
-- ["a","b","c","","y","z"]
  +
</haskell>

Revision as of 16:29, 13 December 2008

A theoretical module which contains implementations/combinators for implementing every possible method of list-splitting known to man. This way no one has to argue about what the correct interface for split is, we can just have them all.

Add your implementations below! Once we converge on something good we can upload it to hackage.

{-# LANGUAGE ViewPatterns #-}

import Data.List (unfoldr)


-- intercalate :: [a] -> [[a]] -> [a]
-- intercalate x [a,b,c,x,y,z] = [a,x,b,x,c,x,x,y,x,z,x]

-- unintercalate :: [a] -> [[a]] -> [a]
-- unintercalate x [a,x,b,x,c,x,x,y,x,z,x] = [a,b,c,[],y,z]

-- unintercalate is the "inverse" of intercalate

match [] string = Just string
match (_:_) [] = Nothing
match (p:ps) (q:qs) | p == q = match ps qs
match (_:_)  (_:_)  | otherwise = Nothing

chopWith delimiter (match delimiter -> Just tail) = return ([], tail)
chopWith delimiter (c:cs) = chopWith delimiter cs >>= \(head, tail) ->
                              return (c:head, tail)
chopWith delimiter [] = Nothing

unintercalate delimiter = unfoldr (chopWith delimiter)

-- > unintercalate "x" "axbxcxxyxzx"
-- ["a","b","c","","y","z"]