type Player = Integer
type Card = Integer
type Hand = [Card]
type Deck = Hand
type Hands = Player -> Hand
deal' :: Player -> (Player -> Player) -> Deck -> [Hands -> Hands]
deal' player next [] = []
deal' player next (card : cards) = giveTo player card : deal' (next player) next cards
giveTo player card hands = \player' ->
if player == player'
then card : hands player'
else hands player'
deal'' :: [Hands -> Hands] -> Hands
deal'' [] = const []
deal'' (action : actions) = action (deal'' actions)
deal players = deal'' . deal' 0 (\player -> (player + 1) `mod` players)
-- *Main> deal 3 [5,6,8,9,7,5,4,2,3,1,5,6,7] 0
-- [5,9,4,1,7]
-- *Main> deal 3 [5,6,8,9,7,5,4,2,3,1,5,6,7] 1
-- [6,7,2,5]
-- *Main> deal 3 [5,6,8,9,7,5,4,2,3,1,5,6,7] 2
-- [8,5,3,6]
-- *Main> deal 3 [5,6,8,9,7,5,4,2,3,1,5,6,7] 3
-- []