Skip to content

Instantly share code, notes, and snippets.

@greim
Created June 24, 2016 20:26
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save greim/539449a94497121c3a3d2e3251bc9c9d to your computer and use it in GitHub Desktop.
Save greim/539449a94497121c3a3d2e3251bc9c9d to your computer and use it in GitHub Desktop.
Queue data structure in Elm
type Queue a
= Empty
| Mono a
| Multi a (Queue a) a
enq : a -> Queue a -> Queue a
enq val queue =
case queue of
Empty ->
Mono val
Mono item ->
Multi item Empty val
Multi front midQueue back ->
Multi front (enq back midQueue) val
deq : Queue a -> (Maybe a, Queue a)
deq queue =
case queue of
Empty ->
(Nothing, Empty)
Mono item ->
(Just item, Empty)
Multi front midQueue back ->
let
(maybeNewFront, newMidQueue) = deq midQueue
in
case maybeNewFront of
Nothing ->
(Just front, Mono back)
Just newFront ->
(Just front, Multi newFront newMidQueue back)
peek : Queue a -> Maybe a
peek queue =
case queue of
Empty ->
Nothing
Mono item ->
Just item
Multi front midQueue back ->
Just front
length : Queue a -> Int
length queue =
case queue of
Empty ->
0
Mono item ->
1
Multi front midQueue back ->
2 + (length midQueue)
toList : Queue a -> List a
toList queue =
case queue of
Empty ->
[]
Mono item ->
[item]
Multi front midQueue back ->
List.append (front :: (toList midQueue)) [back]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment