mirror of
https://code.sup39.dev/repos/Wqawg
synced 2025-03-20 04:46:22 +09:00
Generate commit diff data for git repos
This commit is contained in:
parent
2fb00c914a
commit
dbec638415
4 changed files with 99 additions and 15 deletions
src/Data/List
|
@ -1,6 +1,6 @@
|
|||
{- This file is part of Vervis.
|
||||
-
|
||||
- Written in 2016 by fr33domlover <fr33domlover@riseup.net>.
|
||||
- Written in 2016, 2018 by fr33domlover <fr33domlover@riseup.net>.
|
||||
-
|
||||
- ♡ Copying is an act of love. Please copy, reuse and share.
|
||||
-
|
||||
|
@ -15,11 +15,15 @@
|
|||
|
||||
module Data.List.Local
|
||||
( -- groupByFst
|
||||
groupJusts
|
||||
, groupEithers
|
||||
)
|
||||
where
|
||||
|
||||
import Prelude
|
||||
|
||||
import Data.List.NonEmpty (NonEmpty (..), (<|))
|
||||
|
||||
-- | Takes a list of pairs and groups them by consecutive ranges with equal
|
||||
-- first element. Returns a list of pairs, where each pair corresponds to one
|
||||
-- such range.
|
||||
|
@ -28,3 +32,25 @@ groupByFst [] = []
|
|||
groupByFst ((x, y):ps) =
|
||||
let (same, rest) = span ((== x) . fst) ps
|
||||
in (x, y : map snd same) : groupByFst rest
|
||||
|
||||
-- | Group together sublists of Just items, and drop the Nothing items.
|
||||
--
|
||||
-- >>> groupJusts [Nothing, Nothing, Just 1, Just 4, Nothing, Just 2]
|
||||
-- [[1, 4], [2]]
|
||||
groupJusts :: [Maybe a] -> [NonEmpty a]
|
||||
groupJusts maybes = prepend $ foldr go (Nothing, []) maybes
|
||||
where
|
||||
prepend (Nothing, l) = l
|
||||
prepend (Just x , l) = x : l
|
||||
go Nothing (Nothing, ls) = (Nothing , ls)
|
||||
go Nothing (Just l , ls) = (Nothing , l : ls)
|
||||
go (Just x) (Nothing, ls) = (Just $ x :| [], ls)
|
||||
go (Just x) (Just l , ls) = (Just $ x <| l , ls)
|
||||
|
||||
groupEithers :: [Either a b] -> ([b], [(NonEmpty a, NonEmpty b)], [a])
|
||||
groupEithers = foldr go ([], [], [])
|
||||
where
|
||||
go (Left x) ([] , [] , as) = ([], [] , x : as)
|
||||
go (Left x) ([] , (xs, ys):ps, as) = ([], (x <| xs, ys) : ps , as)
|
||||
go (Left x) (b:bs, ps , as) = ([], (x :| [], b :| bs) : ps, as)
|
||||
go (Right y) (bs, ps, as) = (y : bs, ps, as)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue