Copyright | Copyright (c) 2014 Kenneth Foner |
---|---|

Maintainer | kenneth.foner@gmail.com |

Stability | experimental |

Portability | non-portable |

Safe Haskell | Safe-Inferred |

Language | Haskell2010 |

This module implements two-way infinite streams with a focused element, akin to a Turing machine's tape. This structure is also known by the name of a list zipper (although in this case it's a list zipper with the additional criterion that the list is infinite in both directions).

# Documentation

A `Tape`

is like a Turing-machine tape: infinite in both directions, with a focus in the middle.

Functor Tape | |

Applicative Tape | A tape is |

Comonad Tape | Tapes form a comonad, where extract gives the focus element and duplicate gives a |

ComonadApply Tape | Applying one tape to another moves them together. This is like the |

Distributive Tape | Tapes are |

:: (c -> (a, c)) | leftwards unfolding function |

-> (c -> a) | function giving the focus value from the seed |

-> (c -> (a, c)) | rightwards unfolding function |

-> c | seed value |

-> Tape a |

Produce a `Tape`

from a seed value, ala unfoldr for lists, or unfold for `Stream`

s.

:: (a -> a) | leftwards iteration function |

-> (a -> a) | rightwards iteration function |

-> a | focus value |

-> Tape a |

Produce a `Tape`

consisting of the infinite iteration of two functions to a starting focus value,
ala iterate for lists or `Stream`

s.

enumerate :: Enum a => a -> Tape a Source

Given an enumerable type, produce the `Tape`

where the left side is the sequence of predecessors,
and the right side is the sequence of successors.

moveL :: Tape a -> Tape a Source

The functions `moveR`

and `moveL`

move the focus on the tape right and left, respectively.