Source code for ipytracer.tracer
# -*- coding: UTF-8 -*-
# Copyright (c) Han Lee.
# Distributed under the terms of the Modified BSD License.
from ipywidgets import (
DOMWidget,
Layout
)
from traitlets import (
Unicode,
Int,
List,
default
)
import time
from uuid import uuid4
[docs]class Tracer(DOMWidget):
"""Abstract base class for Tracers.
Tracer with specific codes are specializations of this class.
Tracer class is also eventful list.
:type data: list
:param data Data to track
:type delay: float
:param delay Animation delay in milliseconds for each event (default 0.25)
"""
data = List().tag(sync=True)
_id = Unicode().tag(sync=True)
_view_module = Unicode('ipytracer').tag(sync=True)
_model_module = Unicode('ipytracer').tag(sync=True)
notified = Int(-1).tag(sync=True)
selected = Int(-1).tag(sync=True)
visited = Int(-1).tag(sync=True)
def __init__(self, data, delay=0.25, **kwargs):
super(Tracer, self).__init__(**kwargs)
self.data = data
self._data = data
self.delay = delay
self._id = str(uuid4())
def __add__(self, other):
self._data += other
self.data = self._data[:]
time.sleep(self.delay)
def __delitem__(self, key):
del self._data[key]
self.data = self._data[:]
time.sleep(self.delay)
def __getitem__(self, key):
self.visited = key
time.sleep(self.delay)
return self.data[key]
def __len__(self):
return len(self.data)
def __setitem__(self, key, value):
self._data[key] = value
self.data = self._data[:]
self.selected = key
time.sleep(self.delay)
[docs] def append(self, value):
self._data.append(value)
self.data = list(self._data)
[docs] def extend(self, L):
self._data.extend(L)
self.data = list(self._data)
[docs] def insert(self, i, x):
self._data.insert(i, x)
self.data = list(self._data)
[docs] def remove(self, x):
self._data.remove(x)
self.data = list(self._data)
[docs] def pop(self, i):
self._data.pop(i)
self.data = list(self._data)
[docs] def index(self, x):
return self.data.index(x)
[docs] def count(self, x):
return self.data.count(x)
[docs] def sort(self, key=None, reverse=False):
self._data.sort(key=key, reverse=reverse)
self.data = list(self._data)
[docs] def reverse(self):
self._data.reverse()
self.data = list(self._data)
[docs]class ChartTracer(Tracer):
"""
This tracer representing a one-dimensional list as a chart diagram
:param data to track
:param delay Animation delay in milliseconds for each event (default 0.25)
"""
_view_name = Unicode('ChartTracerView').tag(sync=True)
_model_name = Unicode('ChartTracerModel').tag(sync=True)
labels = List().tag(sync=True)
@default('layout')
def _default_layout(self):
return Layout(width='100%', height='300px')
def __init__(self, data, delay=0.25, **kwargs):
super(ChartTracer, self).__init__(data, delay, **kwargs)
self.labels = [i for i in range(len(self.data))]
[docs]class DirectedGraphTracer(Tracer):
"""
Graph Data Type Visualization Tracer
"""
_view_name = Unicode('DirectedGraphTracerView').tag(sync=True)
_model_name = Unicode('DirectedGraphTracerModel').tag(sync=True)
@default('layout')
def _default_layout(self):
return Layout(width='100%', height='300px')
def __init__(self, data, delay=0.25):
super(DirectedGraphTracer, self).__init__(data, delay)
[docs]class TreeTracer(Tracer):
"""
Tree Data Type Visualization Tracer
"""
_view_name = Unicode('TreeTracerView').tag(sync=True)
_model_name = Unicode('TreeTracerModel').tag(sync=True)
def __init__(self, data, delay=0.25):
super(TreeTracer, self).__init__(data, delay)
[docs]class List1DTracer(Tracer):
"""
This tracer representing a one-dimensional list as a HTML Table
"""
_view_name = Unicode('List1DTracerView').tag(sync=True)
_model_name = Unicode('List1DTracerModel').tag(sync=True)