module List
( ordNub
, sortOn
, uncons
, snoc
, windows
, chunksOf
) where
import Data.Bool (otherwise)
import Data.Function ((.))
import Data.Int (Int)
import Data.List (drop, length, sortBy, take, (++))
import Data.Maybe (Maybe (..))
import Data.Ord (Ord (..), comparing)
import qualified Data.Set as Set
sortOn :: (Ord o) => (a -> o) -> [a] -> [a]
sortOn = sortBy . comparing
ordNub :: (Ord a) => [a] -> [a]
ordNub l = go Set.empty l
where
go _ [] = []
go s (x:xs) =
if x `Set.member` s
then go s xs
else x : go (Set.insert x s) xs
uncons :: [a] -> Maybe (a, [a])
uncons [] = Nothing
uncons (x:xs) = Just (x, xs)
snoc :: [a] -> a -> [a]
snoc as a = as ++ [a]
windows :: Int -> [a] -> [[a]]
windows _ [] = []
windows i xss@(_:xs)
| length xss >= i = (take i xss) : windows i xs
| otherwise = []
chunksOf :: Int -> [a] -> [[a]]
chunksOf _ [] = []
chunksOf i xs
| length xs >= i = take i xs : chunksOf i (drop i xs)
| otherwise = [xs]