scalaで(エセ)treeコマンド

前回のscala勉強会は、仕事で出れなかった訳ですが(´;ω;`)ブワッ

なにやらtreeコマンドが流行っていたらしい(これ とか これ とか)ので、つくってみた・・・けど、結局中途半端w

import java.io.File

object TreeTest {

  /** ディレクトリ(又はファイル)を表すクラス
   * 再帰的に、すべての子供の階層への参照を保持
   * 
   * @param self ファイルまたはディレクトリ
   * @param child ディレクトリの場合、ディレクトリのなかのファイル。
   * ファイルの場合Nil
   * @param level ディレクトリ階層の深さ
   */
  case class Dir( self:File , child:List[Dir] , level:Int ){
  
    override def toString = {
    
      val indent = ( "   " * level ) +  "|-- "
    
      self.getName + "\n" + {
        
        child match{
          case Nil => ""
          case _   => {
            child.mkString( indent ,indent , "" )
          }
        }
      }
    }
  }
  

  /**
   * ある階層から下のファイルとディレクトリをすべて探す
   * @param dir ディレクトリ
   * @param level ディレクトリ階層の深さ
   */
  def searchFiles( dir:File ,level:Int ):Dir = {

    Dir( dir ,
    
      dir.listFiles.collect {
        case f if f.isDirectory => searchFiles( f ,level + 1 )
        case f if f.isFile => Dir( f , Nil , level + 1 )
      
      }.toList
      ,
      level
    )
  }
}

考えとして、

プリントする前に一度、階層をすべて調べ上げる => その後まとめて一気に表示

ってやろうとした。動作的には、まとめて一気に表示っていうのはできたんだけど

表示結果が、若干結果違う・・・

とにかく単純にしようと短くしたのはいいけど、末尾再帰じゃないしねぇ(´・ω・`)

例えば、scala.collection以下を調べるとこんな感じの実行結果↓

線が繋がってないから明らかにではない orz 。

階層の深さでインデントしてるだけ(´Д`)

collection
   |-- BitSet.scala
   |-- BitSetLike.scala
   |-- BufferedIterator.scala
   |-- DefaultMap.scala
   |-- generic
      |-- Addable.scala
      |-- BitSetFactory.scala
      |-- CanBuildFrom.scala
      |-- FilterMonadic.scala
      |-- GenericCompanion.scala
      |-- GenericSetTemplate.scala
      |-- GenericTraversableTemplate.scala
      |-- Growable.scala
      |-- HasNewBuilder.scala
      |-- ImmutableMapFactory.scala
      |-- ImmutableSetFactory.scala
      |-- ImmutableSortedMapFactory.scala
      |-- ImmutableSortedSetFactory.scala
      |-- IterableForwarder.scala
      |-- MapFactory.scala
      |-- MutableMapFactory.scala
      |-- MutableSetFactory.scala
      |-- package.scala
      |-- SeqFactory.scala
      |-- SeqForwarder.scala
      |-- SetFactory.scala
      |-- Shrinkable.scala
      |-- Sorted.scala
      |-- SortedMapFactory.scala
      |-- SortedSetFactory.scala
      |-- Subtractable.scala
      |-- TraversableFactory.scala
      |-- TraversableForwarder.scala
   |-- immutable
      |-- BitSet.scala
      |-- DefaultMap.scala
      |-- HashMap.scala
      |-- HashSet.scala
      |-- IndexedSeq.scala
      |-- IntMap.scala
      |-- Iterable.scala
      |-- LinearSeq.scala
      |-- List.scala
      |-- ListMap.scala
      |-- ListSet.scala
      |-- LongMap.scala
      |-- Map.scala
      |-- MapLike.scala
      |-- MapProxy.scala
      |-- NumericRange.scala
      |-- PagedSeq.scala
      |-- Queue.scala
      |-- Range.scala
      |-- RedBlack.scala
      |-- Seq.scala
      |-- Set.scala
      |-- SetProxy.scala
      |-- SortedMap.scala
      |-- SortedSet.scala
      |-- Stack.scala
      |-- Stream.scala
      |-- StringLike.scala
      |-- StringOps.scala
      |-- Traversable.scala
      |-- TreeHashMap.scala
      |-- TreeMap.scala
      |-- TreeSet.scala
      |-- Vector.scala
      |-- WrappedString.scala
   |-- IndexedSeq.scala
   |-- IndexedSeqLike.scala
   |-- IndexedSeqOptimized.scala
   |-- interfaces
      |-- IterableMethods.scala
      |-- MapMethods.scala
      |-- SeqMethods.scala
      |-- SetMethods.scala
      |-- TraversableMethods.scala
      |-- TraversableOnceMethods.scala
   |-- Iterable.scala
   |-- IterableLike.scala
   |-- IterableProxy.scala
   |-- IterableProxyLike.scala
   |-- IterableView.scala
   |-- IterableViewLike.scala
   |-- Iterator.scala
   |-- JavaConversions.scala
   |-- LinearSeq.scala
   |-- LinearSeqLike.scala
   |-- LinearSeqOptimized.scala
   |-- Map.scala
   |-- MapLike.scala
   |-- MapProxy.scala
   |-- MapProxyLike.scala
   |-- mutable
      |-- AddingBuilder.scala
      |-- ArrayBuffer.scala
      |-- ArrayBuilder.scala
      |-- ArrayLike.scala
      |-- ArrayOps.scala
      |-- ArraySeq.scala
      |-- ArrayStack.scala
      |-- BitSet.scala
      |-- Buffer.scala
      |-- BufferLike.scala
      |-- BufferProxy.scala
      |-- Builder.scala
      |-- Cloneable.scala
      |-- CloneableCollection.scala
      |-- ConcurrentMap.scala
      |-- DefaultEntry.scala
      |-- DefaultMapModel.scala
      |-- DoubleLinkedList.scala
      |-- DoubleLinkedListLike.scala
      |-- FlatHashTable.scala
      |-- GrowingBuilder.scala
      |-- HashEntry.scala
      |-- HashMap.scala
      |-- HashSet.scala
      |-- HashTable.scala
      |-- History.scala
      |-- ImmutableMapAdaptor.scala
      |-- ImmutableSetAdaptor.scala
      |-- IndexedSeq.scala
      |-- IndexedSeqLike.scala
      |-- IndexedSeqOptimized.scala
      |-- IndexedSeqView.scala
      |-- Iterable.scala
      |-- LazyBuilder.scala
      |-- LinearSeq.scala
      |-- LinkedEntry.scala
      |-- LinkedHashMap.scala
      |-- LinkedHashSet.scala
      |-- LinkedList.scala
      |-- LinkedListLike.scala
      |-- ListBuffer.scala
      |-- ListMap.scala
      |-- Map.scala
      |-- MapBuilder.scala
      |-- MapLike.scala
      |-- MapProxy.scala
      |-- MultiMap.scala
      |-- MutableList.scala
      |-- ObservableBuffer.scala
      |-- ObservableMap.scala
      |-- ObservableSet.scala
      |-- OpenHashMap.scala
      |-- PriorityQueue.scala
      |-- PriorityQueueProxy.scala
      |-- Publisher.scala
      |-- Queue.scala
      |-- QueueProxy.scala
      |-- ResizableArray.scala
      |-- RevertibleHistory.scala
      |-- Seq.scala
      |-- Set.scala
      |-- SetBuilder.scala
      |-- SetLike.scala
      |-- SetProxy.scala
      |-- Stack.scala
      |-- StackProxy.scala
      |-- StringBuilder.scala
      |-- Subscriber.scala
      |-- SynchronizedBuffer.scala
      |-- SynchronizedMap.scala
      |-- SynchronizedPriorityQueue.scala
      |-- SynchronizedQueue.scala
      |-- SynchronizedSet.scala
      |-- SynchronizedStack.scala
      |-- Traversable.scala
      |-- Undoable.scala
      |-- WeakHashMap.scala
      |-- WrappedArray.scala
      |-- WrappedArrayBuilder.scala
   |-- package.scala
   |-- readme-if-you-want-to-add-something.txt
   |-- script
      |-- Location.scala
      |-- Message.scala
      |-- Scriptable.scala
   |-- Seq.scala
   |-- SeqLike.scala
   |-- SeqProxy.scala
   |-- SeqProxyLike.scala
   |-- SeqView.scala
   |-- SeqViewLike.scala
   |-- Set.scala
   |-- SetLike.scala
   |-- SetProxy.scala
   |-- SetProxyLike.scala
   |-- SortedMap.scala
   |-- SortedMapLike.scala
   |-- SortedSet.scala
   |-- SortedSetLike.scala
   |-- Traversable.scala
   |-- TraversableLike.scala
   |-- TraversableOnce.scala
   |-- TraversableProxy.scala
   |-- TraversableProxyLike.scala
   |-- TraversableView.scala
   |-- TraversableViewLike.scala
   |-- views